2011-01-05 90 views
19

Mi cadena es así:Extracto de la última palabra de una cadena usando C#

string input = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; 

Aquí realmente quiero extraer la última palabra, 'API', y el retorno.

¿Cuál sería el código C# para hacer la extracción anterior?

+0

Es "Strip", una palabra, o es la primera palabra "Gaza"? –

+0

¿Cuál es tu patrón? ¿Las últimas 3 letras? ¿Lo último apareció después de +? ¿Lo último aparece después del último operador? – xandy

Respuesta

51

Bueno, la implementación ingenuo que sería dividir simplemente en cada espacio y tomar el último elemento.

La división se realiza utilizando un método de instancia en el objeto String, y el último de los elementos se puede recuperar utilizando la indexación de matriz o utilizando el operador LINQ Last.

Resultado final:

string lastWord = input.Split(' ').Last(); 

Si usted no tiene LINQ, lo haría en dos operaciones:

string[] parts = input.Split(' '); 
string lastWord = parts[parts.Length - 1]; 

Mientras que esto funcionaría para esta cadena, no podría funcionar para una cadena ligeramente diferente, por lo que tendrá que descubrir cómo cambiar el código en consecuencia o publicar todas las reglas.

string input = ".... ,API"; 

Aquí, la coma sería parte de la "palabra".

Además, si el primer método de obtención de la palabra es correcta, es decir, todo después de que el último espacio, y la cadena se adhiere a las siguientes reglas:

  • Will siempre contienen al menos un espacio
  • no termina con uno o más espacios (en el caso de esta se puede recortar)

continuación, puede utilizar este código que se asigne un menor número de objetos en el montón para GC de preocuparse más tarde:

string lastWord = input.Substring(input.LastIndexOf(' ') + 1); 

Sin embargo, si necesita considerar comas, puntos y comas, el primer método que utiliza división es el mejor; hay menos cosas de las que hacer un seguimiento.

+0

La 'Subcadena (input.LastIndexOf ('') + 1) 'es sin duda la mejor opción para el rendimiento, ¿por qué alguien en la tierra dividiría una cadena entera para obtener la última palabra? Y por cierto, ** te equivocas ** acerca de los caracteres faltantes; la subcadena devolverá el último índice de '' o el último índice de la cadena completa, lo que significa el mismo resultado. Compruébelo usted mismo: http://rextester.com/IFEGJ69776 – Shimmy

+1

@Shimmy '.LastIndexOf' no devuelve" último índice de cadena completa "(que en realidad sería' 0') si no puede encontrar la coincidencia de cadena, devuelve '-1' que, por supuesto, se convierte en' 0' al agregar '1', que da la cadena completa en esta instancia. –

+0

Marca este enlace, estoy probando una cadena vacía y da el mismo resultado. [Verlo] (http://rextester.com/CXJYN16822). – Shimmy

10

Primero:

using System.Linq; // System.Core.dll 

continuación

string last = input.Split(' ').LastOrDefault(); 

// or 

string last = input.Trim().Split(' ').LastOrDefault(); 

// or 

string last = input.Trim().Split(' ').LastOrDefault().Trim(); 
+0

¿Qué pasa si después de la última palabra si está teniendo algún espacio como "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; – Pradeep

+0

@Pradeep: Actualicé mi publicación – abatishchev

+0

No puedo usar Last(), dice que system.array no contiene la definición de Last. Mi clase está implementando una interfaz, creo que esa es la razón por la que no puedo usar last(), así que díganme cómo usarlo. – Pradeep

6

var last = input.Substring(input.LastIndexOf(' ')).TrimStart();

Este método no asigna toda una matriz de cadenas como hacen los demás.

+0

¿Necesita hacer +1 a LastIndexOf()? ¿O he hecho mal mi respuesta? :) –

+0

@El Ronnoco Sí, lo haces, pero tu respuesta fallará si la cadena termina en un espacio. (índice más allá del final de la cadena = excepción). TrimStart es más seguro. :) –

+0

Err, oops. Lo tengo mal. Falla cerebral –

0
string input = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; 
var a = input.Split(' '); 
Console.WriteLine(a[a.Length-1]); 
2
string workingInput = input.Trim(); 
string last = workingInput.Substring(workingInput.LastIndexOf(' ')).Trim(); 

Aunque esto puede fallar si no tiene espacios en la cadena.Creo que la división es innecesariamente intensiva sólo por una palabra :)

1
var lastWord = input.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Last(); 
1
static class Extensions 
{ 
    private static readonly char[] DefaultDelimeters = new char[]{' ', '.'}; 

    public string LastWord(this string StringValue) 
    { 
     return LastWord(StringValue, DefaultDelimeters); 
    } 

    public string LastWord(this string StringValue, char[] Delimeters) 
    { 
     int index = StringValue.LastIndexOfAny(Delimeters); 

     if(index>-1) 
      return StringValue.Substring(index); 
     else 
      return null; 
    } 
} 

class Application 
{ 
    public void DoWork() 
    { 
     string sentence = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; 
     string lastWord = sentence.LastWord(); 
    } 
} 
Cuestiones relacionadas