Extrae solo a la derecha la mayoría de las n letras de una cadena

110

¿Cómo puedo extraer un substring que se compone de las seis letras más a la derecha de otra string?

Ej: mi cadena es "PER 343573" . Ahora solo quiero extraer "343573".

¿Cómo puedo hacer esto?

Shyju
fuente
Puede usar el código fuente para el método VB.NET Right. Primero necesitaría convertir a C #: referenceource.microsoft.com/#Microsoft.VisualBasic/… Convierta a C # usando converter.telerik.com
Darren Griffith
pero el código de VB se basa en la función de subcadena c # en strings.sc
Our Man in Bananas
Esta no es realmente una buena manera de hacerlo, pero si está en apuros, puede agregar una referencia a Microsoft.VisualBasic.dll y usar el método Correcto. No es un método de extensión. Tienes que usarlo así:string endOfString = Strings.Right(wholeString, 6);
Alan McBee - MSFT

Respuestas:

156
string SubString = MyString.Substring(MyString.Length-6);
Vilx-
fuente
35
Este enfoque no funciona correctamente si la cadena no es tan larga como el número de caracteres requerido.
stevehipwell
1
Dependiendo de lo que quiera exactamente el OP, también se pueden lanzar expresiones regulares a esto. Si solo quiere el número al final de la cadena, esa es definitivamente la solución más sencilla, especialmente cuando el número de dígitos puede variar en alguna actualización de software posterior.
Joey
2
@Johannes Rössel - Soy un gran fanático de las expresiones regulares (vea mis respuestas), pero nunca las recomendaría para una situación simple como esta. Cualquiera de las respuestas que utilizan un contenedor de funciones se adapta mejor al mantenimiento del código que una expresión regular. Un método de extensión (o función estándar si .NET 2.0) es la mejor solución.
stevehipwell
@ Stevo3000: tener una solución que arroje si la cadena tiene la longitud incorrecta es una solución válida. No es la única solución, pero aún así.
Marc L.
3
@James - para ser igual de delicado, solo el título menciona "n letras". La pregunta real planteada pedía "las seis letras más a la derecha" :)
Chris Rogers
69

Escribe un método de extensión para expresar la Right(n);función. La función debe tratar con cadenas nulas o vacías que devuelven una cadena vacía, cadenas más cortas que la longitud máxima que devuelven la cadena original y cadenas más largas que la longitud máxima que devuelven la longitud máxima de los caracteres más a la derecha.

public static string Right(this string sValue, int iMaxLength)
{
  //Check if the value is valid
  if (string.IsNullOrEmpty(sValue))
  {
    //Set valid empty string as string could be null
    sValue = string.Empty;
  }
  else if (sValue.Length > iMaxLength)
  {
    //Make the string no longer than the max length
    sValue = sValue.Substring(sValue.Length - iMaxLength, iMaxLength);
  }

  //Return the string
  return sValue;
}
stevehipwell
fuente
El índice de inicio tampoco puede ser menor que 0.
James
2
@James - ¡No será como sValue.Length > iMaxLengthantes de que se llame a una subcadena!
stevehipwell
3
Gran respuesta, pero fue un poco complicado ver la notación húngara en el código C #.
Jerad Rose
1
@JeradRose: trabajo en un proyecto en el que la base de código evolucionó a partir de una aplicación VB3 (la mayor parte es VB.NET), por lo que hay algunos restos.
stevehipwell
4
@Jalle, VB.NET tiene Left, Right y Mid como funciones de nivel superior, además de muchas otras cosas útiles que no forman parte de C #. No estoy seguro de por qué, ya que muchas de ellas son funciones decentes.
ingrediente_15939
40

Probablemente sea más agradable usar un método de extensión:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }
}

Uso

string myStr = "PER 343573";
string subStr = myStr.Right(6);
James
fuente
19
Entonces arrojaría una NullReferenceException tal como lo haría si intentara usar cualquier método en una cadena nula ...
James
1
str.Length - lengthpodría ser negativo. Además, el segundo parámetro es opcional. No es necesario pasar la longitud.
iheartcsharp
1
@ JMS10 ciertamente podría ser, pero eso es más la preocupación de las personas que llaman que la mía. Además, sí, es justo, podría usar la anulación que solo toma el parámetro único aquí.
James
str? .Substring (str.Length - longitud, longitud);
Ludwo
26
using System;

public static class DataTypeExtensions
{
    #region Methods

    public static string Left(this string str, int length)
    {
        str = (str ?? string.Empty);
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        str = (str ?? string.Empty);
        return (str.Length >= length)
            ? str.Substring(str.Length - length, length)
            : str;
    }

    #endregion
}

No debe producirse un error, devuelve nulos como una cadena vacía, devuelve valores recortados o base. Úselo como "testx" .Left (4) o str.Right (12);

Jeff Crawford
fuente
13

MSDN

String mystr = "PER 343573";
String number = mystr.Substring(mystr.Length-6);

EDITAR: demasiado lento ...

RvdK
fuente
9

si no está seguro de la longitud de su cadena, pero está seguro del recuento de palabras (siempre 2 palabras en este caso, como 'xxx yyyyyy'), será mejor que use split.

string Result = "PER 343573".Split(" ")[1];

esto siempre devuelve la segunda palabra de su cadena.

Mahdi Tahsildari
fuente
Sí; supongamos que el texto de OP SIEMPRE tiene espacios en blanco; como en su ejemplo :)
Christian
1
Hei Christian :) todos sabemos más de un par de líneas de respuesta. Acabo de responder a la pregunta brevemente, por supuesto, hay muchas más cosas a considerar en el código real.
Mahdi Tahsildari
7

Esto no es exactamente lo que está pidiendo, pero con solo mirar el ejemplo, parece que está buscando la sección numérica de la cadena.

Si este es siempre el caso, entonces una buena forma de hacerlo sería usando una expresión regular.

var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;
escalofríos42
fuente
-1 Las expresiones regulares son un poco exageradas para algo como esto, especialmente cuando ya hay métodos integrados para hacerlo.
James
1
No estoy defendiendo el uso de este método si realmente solo necesita los últimos 6, pero si su objetivo es extraer un número (como una identificación) que puede cambiar a 5 o 7 dígitos en algún momento en el futuro, esto es una mejor manera.
chills42
1
Respuesta anterior, pero +1 para admitir el uso de expresiones regulares. Especialmente porque (todavía) no hay métodos integrados en la implementación de String de .NET para hacer esto @James. De lo contrario, es posible que esta pregunta nunca haya existido.
CrazyIvan 1974
@ CrazyIvan1974 no estoy seguro de por qué me has mencionado en tu comentario
James
5

Utilizar este:

String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}
cjk
fuente
text? .Substring (text.Length - 6)
Ludwo
5

Adivinando sus requisitos, pero la siguiente expresión regular arrojará solo 6 caracteres alfanuméricos antes del final de la cadena y ninguna coincidencia de lo contrario.

string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
Vadear
fuente
¿Esta solución no cumple razonablemente con los vagos requisitos? Si no es así, explique su voto negativo.
Wade
5

Dado que está utilizando .NET, que se compila en MSIL , solo haga referencia a Microsoft.VisualBasic y use el Strings.Rightmétodo integrado de Microsoft :

using Microsoft.VisualBasic;
...
string input = "PER 343573";
string output = Strings.Right(input, 6);

No es necesario crear un método de extensión personalizado u otro trabajo. El resultado se logra con una referencia y una simple línea de código.

Como información adicional sobre esto, el uso de métodos de Visual Basic con C # se ha documentado en otra parte . Personalmente, me topé con él primero al intentar analizar un archivo, y encontré que este hilo SO sobre el uso de la Microsoft.VisualBasic.FileIO.TextFieldParserclase es extremadamente útil para analizar archivos .csv.

Aaron Thomas
fuente
Este enfoque también se detalló en otro hilo SO aquí: stackoverflow.com/a/15255454/2658159
Aaron Thomas
¡Eso es MENTAL! Pero como chico de VB, ¡es bueno dominar a los CSharpers por una vez!
SteveCinq
5
var str = "PER 343573";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // "343573"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "343573"

esto admite cualquier número de caracteres en el str. el código alternativo no admite nullcadena. y el primero es más rápido y el segundo es más compacto.

Prefiero el segundo si conozco la strcadena corta que contiene. si es una cuerda larga, la primera es más adecuada.

p.ej

var str = "";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // ""
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // ""

o

var str = "123";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // "123"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "123"
Supawat Pusavanno
fuente
1
Me gusta esa alternativa. Detallado, pero fácil de entender y maneja el problema de la cadena demasiado corta de forma automática.
Andrew Grothe
3

Utilizar este:

string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));

Brandao
fuente
3

Otra solución que puede no mencionarse

S.Substring(S.Length < 6 ? 0 : S.Length - 6)
PARPADEO
fuente
3

Métodos seguros nulos:

Cadenas más cortas que la longitud máxima que devuelven la cadena original

Método de extensión de cadena a la derecha

public static string Right(this string input, int count) =>
    String.Join("", (input + "").ToCharArray().Reverse().Take(count).Reverse());

Método de extensión de cadena a la izquierda

public static string Left(this string input, int count) =>
    String.Join("", (input + "").ToCharArray().Take(count));
desmati
fuente
2

Aquí está la solución que uso ... Comprueba que la longitud de la cadena de entrada no sea menor que la longitud solicitada. Desafortunadamente, las soluciones que veo publicadas anteriormente no tienen esto en cuenta, lo que puede provocar fallas.

    /// <summary>
    /// Gets the last x-<paramref name="amount"/> of characters from the given string.
    /// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned.
    /// If the given <paramref name="amount"/> is negative, an empty string will be returned.
    /// </summary>
    /// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>
    /// <param name="amount">The amount of characters to return.</param>
    /// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>
    public static string GetLast(this string @string, int amount)
    {
        if (@string == null) {
            return @string;
        }

        if (amount < 0) {
            return String.Empty;
        }

        if (amount >= @string.Length) {
            return @string;
        } else {
            return @string.Substring(@string.Length - amount);
        }
    }
Yves Schelpe
fuente
2

Este es el método que utilizo: me gusta simplificar las cosas.

private string TakeLast(string input, int num)
{
    if (num > input.Length)
    {
        num = input.Length;
    }
    return input.Substring(input.Length - num);
}
Tony_KiloPapaMikeGolf
fuente
1

Solo un pensamiento:

public static string Right(this string @this, int length) {
    return @this.Substring(Math.Max(@this.Length - length, 0));
}
Hamid Sadeghian
fuente
1
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
vldmrrr
fuente
Alguien marcó tu publicación para eliminarla y la vi en una cola de revisión . Creo que tu publicación se marcó incorrectamente. Las respuestas de solo código no son de baja calidad . ¿Intenta responder la pregunta? Si no, marca. ¿Es técnicamente incorrecto? Votar en contra.
Wai Ha Lee
1
El código debe ir acompañado de una explicación escrita sobre cómo soluciona el problema en el OP.
Zze
1
Bueno, pensé que la explicación escrita en los comentarios era suficiente, ¿no?
vldmrrr
0

Sin recurrir al convertidor de bits y al cambio de bits (es necesario estar seguro de la codificación), este es el método más rápido que utilizo como método de extensión 'Derecha'.

string myString = "123456789123456789";

if (myString > 6)
{

        char[] cString = myString.ToCharArray();
        Array.Reverse(myString);
        Array.Resize(ref myString, 6);
        Array.Reverse(myString);
        string val = new string(myString);
}
CJM
fuente
2
Array.Reversetoma una matriz, no una cadena, y if (myString.length > 6). Dejando a un lado los errores de sintaxis, ¿por qué sería este el método más rápido? Seguramente usar una subcadena sería una mejor manera, no requeriría toda esta copia de matrices.
1800 INFORMACIÓN
0

Utilizo Min para prevenir situaciones negativas y también manejo cadenas nulas

// <summary>
    /// Returns a string containing a specified number of characters from the right side of a string.
    /// </summary>
    public static string Right(this string value, int length)
    {
        string result = value;
        if (value != null)
            result = value.Substring(0, Math.Min(value.Length, length));
        return result;
    }
RitchieD
fuente
0
using Microsoft.visualBasic;

 public class test{
  public void main(){
   string randomString = "Random Word";
   print (Strings.right(randomString,4));
  }
 }

la salida es "Word"

Steve corto
fuente