Recorta el último carácter de una cadena


157

Tengo una cuerda que decir

"Hello! world!" 

¡Quiero hacer un recorte o una eliminación para sacar el! fuera del mundo pero no fuera Hola.


1
Tal vez esté más allá de su solicitud, pero ¿puedo pedirle que se tome un momento para pensar en usar la expresión regular que propuse?
Marcello Faga

1
Posible duplicado de Delete last char of string
Tor Klingberg

Respuestas:


298
"Hello! world!".TrimEnd('!');

Lee mas

EDITAR:

Lo que he notado en este tipo de preguntas es que todo el mundo sugiere eliminar el último carácter de una cadena dada. Pero esto no cumple con la definición del método Trim.

Recortar: elimina todas las apariciones de caracteres de espacio en blanco desde el principio y el final de esta instancia.

MSDN-Trim

Según esta definición, eliminar solo el último carácter de la cadena es una mala solución.

Entonces, si queremos "Recortar el último carácter de la cadena", deberíamos hacer algo como esto

Ejemplo como método de extensión:

public static class MyExtensions
{
  public static string TrimLastCharacter(this String str)
  {
     if(String.IsNullOrEmpty(str)){
        return str;
     } else {
        return str.TrimEnd(str[str.Length - 1]);
     }
  }
}

Tenga en cuenta que si desea eliminar todos los caracteres del mismo valor, es decir (!!!!), el método anterior elimina todas las existencias de '!' desde el final de la cadena, pero si desea eliminar solo el último carácter, debe usar esto:

else { return str.Remove(str.Length - 1); }

1
Esto es mejor siempre y cuando siempre sepas qué personaje quieres eliminar del final de la Cadena.
Nimrod Shory

1
Hola Vash, ¿qué opinas sobre mi solución usando un RegEx? Cumple con la solicitud de Thqr y permite eliminar el '!' char de cualquier "mundo!" expresión, en cualquier lugar donde se coloque la expresión, en una sola línea de código.
Marcello Faga

24
-1 ¡Esta solución eliminará todos los mismos caracteres finales! Por ejemplo, se convertiría en "¡Hola!" en "Hola", que elimina más que el último carácter.
Kugel

1
@ Kugel, tienes toda la razón, y por eso deberías leer una vez más mi respuesta. Para una explicación, OP no pregunte cómo eliminar el último carácter, sino cómo recortarlo.
Damian Leszczyński - Vash

1
@Vash: ¿cómo se elimina una comilla simple con el método "Hello! World!". TrimEnd ('!');
Steam

65
String withoutLast = yourString.Substring(0,(yourString.Length - 1));

14
Solo asegúrese de que yourString contenga al menos 1 carácter.
Nimrod Shory el

también asegúrese de que su cadena siempre termine en el carácter que desea eliminar EG: "Hello! World" terminaría como "Hello! Worl".
Nathan Koop

9
if (yourString.Length > 1)
    withoutLast = yourString.Substring(0, yourString.Length - 1);

o

if (yourString.Length > 1)
    withoutLast = yourString.TrimEnd().Substring(0, yourString.Length - 1);

... en caso de que desee eliminar un carácter que no sea un espacio en blanco del final.


9
Voté a solo para compensar el voto negativo sin un comentario. Odio cuando la gente hace eso.
Jeff Reddy

2
Podría haber sido porque no hay un TrimEnd()método y si lo hubiera, podría hacer que la Substring(..)llamada posterior falle en cadenas cortas.
Rory

7
        string s1 = "Hello! world!";
        string s2 = s1.Trim('!');

¿Cómo trabajar con fines con propiedad? ¿Se puede usar aquí?
userAZLogicApps

1
Trim () tiene tan mal nombre. Recorta todos los caracteres iniciales y finales (plural), al igual que TrimStart () y TrimEnd ()
Antony Booth


5
string helloOriginal = "Hello! World!";
string newString = helloOriginal.Substring(0,helloOriginal.LastIndexOf('!'));

5

El otro ejemplo de recortar el último carácter de una cadena:

string outputText = inputText.Remove(inputText.Length - 1, 1);

Puede ponerlo en un método de extensión y evitar que sea una cadena nula, etc.


3
string s1 = "Hello! world!"
string s2 = s1.Substring(0, s1.Length - 1);
Console.WriteLine(s1);
Console.WriteLine(s2);

2

también puedes usar esto:

public static class Extensions
 {

        public static string RemovePrefix(this string o, string prefix)
        {
            if (prefix == null) return o;
            return !o.StartsWith(prefix) ? o : o.Remove(0, prefix.Length);
        }

        public static string RemoveSuffix(this string o, string suffix)
        {
            if(suffix == null) return o;
            return !o.EndsWith(suffix) ? o : o.Remove(o.Length - suffix.Length, suffix.Length);
        }

    }

1

Muy fácil y simple:

str = str.Remove (str.Length - 1);


1

Versión ligeramente modificada de @Damian Leszczyński - Vash que se asegurará de que solo se elimine un personaje específico.

public static class StringExtensions
{
    public static string TrimLastCharacter(this string str, char character)
    {
        if (string.IsNullOrEmpty(str) || str[str.Length - 1] != character)
        {
            return str;
        }
        return str.Substring(0, str.Length - 1);
    }
}

0

Tomé el camino de escribir una extensión usando TrimEnd solo porque ya lo estaba usando en línea y estaba contento con él ... es decir:

static class Extensions
{
        public static string RemoveLastChars(this String text, string suffix)
        {            
            char[] trailingChars = suffix.ToCharArray();

            if (suffix == null) return text;
            return text.TrimEnd(trailingChars);
        }

}

Asegúrese de incluir el espacio de nombres en sus clases usando la clase estática; P y el uso es:

string _ManagedLocationsOLAP = string.Empty;
_ManagedLocationsOLAP = _validManagedLocationIDs.RemoveLastChars(",");          

0

Un ejemplo de clase de extensión para simplificar esto: -

internal static class String
{
    public static string TrimEndsCharacter(this string target, char character) => target?.TrimLeadingCharacter(character).TrimTrailingCharacter(character);
    public static string TrimLeadingCharacter(this string target, char character) => Match(target?.Substring(0, 1), character) ? target.Remove(0,1) : target;
    public static string TrimTrailingCharacter(this string target, char character) => Match(target?.Substring(target.Length - 1, 1), character) ? target.Substring(0, target.Length - 1) : target;

    private static bool Match(string value, char character) => !string.IsNullOrEmpty(value) && value[0] == character;
}

Uso

"!Something!".TrimLeadingCharacter('X'); // Result '!Something!' (No Change)
"!Something!".TrimTrailingCharacter('S'); // Result '!Something!' (No Change)
"!Something!".TrimEndsCharacter('g'); // Result '!Something!' (No Change)

"!Something!".TrimLeadingCharacter('!'); // Result 'Something!' (1st Character removed)
"!Something!".TrimTrailingCharacter('!'); // Result '!Something' (Last Character removed)
"!Something!".TrimEndsCharacter('!'); // Result 'Something'  (End Characters removed)

"!!Something!!".TrimLeadingCharacter('!'); // Result '!Something!!' (Only 1st instance removed)
"!!Something!!".TrimTrailingCharacter('!'); // Result '!!Something!' (Only Last instance removed)
"!!Something!!".TrimEndsCharacter('!'); // Result '!Something!'  (Only End instances removed)

-5

Si quieres eliminar el '!' carácter de una expresión específica ("mundo" en su caso), entonces puede usar esta expresión regular

string input = "Hello! world!";

string output = Regex.Replace(input, "(world)!", "$1", RegexOptions.Multiline | RegexOptions.Singleline);

// result: "Hello! world"

el carácter especial de $ 1 contiene todas las expresiones de "mundo" coincidentes, y se usa para reemplazar el "mundo" original. expresión

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.