2011-03-12 24 views
31

Quiero:¿Cómo eliminar un sufijo del final de la cadena?

  1. Comprobar una variable y determinar si los 2 últimos caracteres son "Id"
  2. Si es así, eliminarlos.

Puedo hacerlo con esto a continuación, pero les explotará si hay una subcadena "Id" distinta del final. ¿Hay un método RemoveFromEnd() que tome un argumento de varios caracteres?

if (column.EndsWith("Id")) 
{ 
     //remove last 2 characters 
     column = column.replace("Id", ""); 
} 

veo this solution: que hace esto:

column = System.Text.RegularExpressions.Regex.Replace(column, "Id$", ""); 

pero dice que es bastante lenta y voy a ejecutar este código dentro de un bloque de código que me gustaría ser muy rápido por lo Quería ver si hay una solución más rápida disponible.

+0

Simplemente curioso cómo "lenta" la expresión regular es (una el anclaje final sin retroceso debería ser rápido) ... aunque la subcadena es más apropiada aquí. OTOH, con la expresión regular no hay condicional/EndsWith explícito. –

+0

El Regex debería ser más rápido en el caso general. ¿Intentó precompilarlo o almacenarlo como miembro para usarlo en su método? (para evitar el costo de crear la expresión regular cada vez) – jdehaan

+0

posible duplicado de [cadena de recorte al final de la cadena] (http://stackoverflow.com/questions/4226657/trim-string-at-the-end-of -the-string) – nawfal

Respuesta

52

String.Substring puede hacer eso:

column = column.Substring(0, column.Length - 2); 

Usted puede utilizarlo para rodar su propia RemoveFromEnd:

public static string RemoveFromEnd(this string s, string suffix) 
{ 
    if (s.EndsWith(suffix)) 
    { 
     return s.Substring(0, s.Length - suffix.Length); 
    } 
    else 
    { 
     return s; 
    } 
} 
+0

Estoy de acuerdo con este enfoque si no quiero usar una expresión regular Pero realmente, ¿cómo podría ser esto más rápido? – DOK

+0

@DOK: ¿más rápido que qué? la expresión regular? – Jon

+0

@DOK: los métodos de manipulación de cadenas en .NET son altamente efectivos. Para operaciones simples como esta, a menudo las encuentro mucho más rápidas que las expresiones regulares. –

4

Puesto que usted sabe la longitud de la pieza para eliminar, puede utilizar Substring:

if (column.EndsWith("Id")) 
{  
    column = column.Substring(0, column.Length - 2); 
} 
+0

Si los dos últimos caracteres no son Id, esto los eliminará por error. – DOK

+1

@DOK: esto está destinado a estar dentro del bloque if, por supuesto (en lugar de la llamada a 'Reemplazar' en el OP. Sin embargo, agregará if-block para mayor claridad. –

1

Pruebe esto:

if (column.IndexOf("Id") == column.Length-2) { 
    column = column.Substring(0, column.Length-2); 
} 
9

Una alternativa al método SubString es utilizar un Regex.Replace de System.Text.RegularExpressions:

using System.Text.RegularExpressions; 
... 
column = Regex.Replace(column, @"Id$", String.Empty); 

De esta manera le permite evitar la prueba, pero no está seguro si es realmente un beneficio velocidad :-). Al menos una alternativa que podría ser útil en algunos casos donde necesita verificar más de una cosa a la vez.

la expresión regular se puede compilar y volver a utilizar para conseguir un poco más de rendimiento y se utiliza en lugar de la llamada al método estático y se puede utilizar como esto:

// stored as a private member 
private static Regex _checkId = new Regex(@"Id$", RegexOptions.Compiled); 
... 
// inside some method 
column = _checkId.Replace(column, String.Empty); 
+0

¿Alguna vez hizo una comparación entre expresiones regulares compiladas y' EndsWith' -'Substring'? – Shimmy

0

par de notas a añadir a @ Jon respuesta:

¿Desea hacer este caso insensiblemente?

if (column.ToLower().EndsWith("id")) { column = column.Remove(column.Length - 2); } 

Si el ID es único en la cadena y debe ser eliminado siempre ...

#No if check.... 
column = column.Replace("Id", ""); 

Si su caso insensible y sólo se produce una vez me gustaría seguir utilizando el primer cheque.

+0

+1 para usar el método 'Remove' – ajukraine

+0

-1; esto no pasa [Turkey Test] (http://www.moserware.com/2008/02/does-your-code-pass- turkey-test.html). Probablemente todavía esté bien para la mayoría de los contextos (ya que la mayoría del código nunca necesita ejecutarse en una configuración regional turca), pero para algunos lectores, este código se romperá efectivamente. –

3

Bueno, no puede ser un método RemoveFromEnd() si usted escribe su propia:

public static string RemoveFromEnd(this string str, string toRemove) 
{ 
    if (str.EndsWith(toRemove)) 
     return str.Substring(0, str.Length - toRemove.Length); 
    else 
     return str; 
} 

Usted sólo puede usar de la siguiente manera:

column = column.RemoveFromEnd("Id"); 
Cuestiones relacionadas