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.

Sphvn
fuente
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); }
Damian Leszczyński - Vash
fuente
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));
Nimrod Shory
fuente
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.

James
fuente
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('!');
JDunkerley
fuente
¿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
6

Prueba esto:

return( (str).Remove(str.Length-1) );
M. Hamza Rajput
fuente
5
string helloOriginal = "Hello! World!";
string newString = helloOriginal.Substring(0,helloOriginal.LastIndexOf('!'));
Nissim
fuente
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.

Bronek
fuente
3
string s1 = "Hello! world!"
string s2 = s1.Substring(0, s1.Length - 1);
Console.WriteLine(s1);
Console.WriteLine(s2);
Jonathan
fuente
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);
        }

    }
Omu
fuente
1

Muy fácil y simple:

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

Seyfi
fuente
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);
    }
}
Mykhailo Seniutovych
fuente
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(",");          
Brian Wells
fuente
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)
Cabina de antony
fuente
-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

Marcello Faga
fuente