Schneiden Sie das letzte Zeichen aus einer Zeichenfolge


156

Ich habe eine Zeichenfolge zu sagen

"Hello! world!" 

Ich möchte ein Trimmen oder Entfernen vornehmen, um das herauszunehmen! aus der Welt, aber nicht aus Hallo.


1
Vielleicht liegt es außerhalb Ihrer Anfrage, aber kann ich Sie bitten, sich einen Moment Zeit zu nehmen, um über die Verwendung des von mir vorgeschlagenen regulären Ausdrucks nachzudenken?
Marcello Faga

1
Mögliches Duplikat von Delete last char of string
Tor Klingberg

Antworten:


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

Weiterlesen

BEARBEITEN:

Was mir bei dieser Art von Fragen aufgefallen ist, schlägt ziemlich jeder vor, das letzte Zeichen einer bestimmten Zeichenfolge zu entfernen. Dies entspricht jedoch nicht der Definition der Trimmmethode.

Trimmen - Entfernt alle Vorkommen von Leerzeichen am Anfang und Ende dieser Instanz.

MSDN-Trim

Unter dieser Definition ist das Entfernen nur des letzten Zeichens aus der Zeichenfolge eine schlechte Lösung.

Wenn wir also "Letztes Zeichen von Zeichenfolge abschneiden" möchten, sollten wir so etwas tun

Beispiel als Erweiterungsmethode:

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]);
     }
  }
}

Beachten Sie, wenn Sie alle Zeichen mit demselben Wert entfernen möchten, dh (!!!!), entfernt die obige Methode alle Existenzen von '!' vom Ende der Zeichenfolge, aber wenn Sie nur das letzte Zeichen entfernen möchten, sollten Sie Folgendes verwenden:

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

1
Dies ist besser, solange Sie immer wissen, welches Zeichen Sie am Ende des Strings entfernen möchten.
Nimrod Shory

1
Hallo Vash, was denkst du über meine Lösung mit einem RegEx? Es erfüllt die Anfrage des Thqr und erlaubt das Entfernen des '!' char aus jeder "Welt!" Ausdruck, wo immer der Ausdruck platziert wird, in nur einer Codezeile.
Marcello Faga

24
-1 Diese Lösung entfernt alle gleichen Endzeichen! ZB würde es "Hallo !!!!!!!!" in "Hallo", wodurch mehr als das letzte Zeichen entfernt wird.
Kugel

1
@ Kugel, du hast vollkommen recht, und deshalb solltest du noch einmal meine Antwort lesen. Zur Erklärung OP fragen Sie nicht, wie Sie das letzte Zeichen entfernen, sondern wie Sie es zuschneiden.
Damian Leszczyński - Vash

1
@Vash - wie entferne ich ein einfaches Anführungszeichen 'mit der Methode - "Hallo! Welt!". TrimEnd ('! ');
Steam

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

14
Stellen Sie nur sicher, dass Ihr String mindestens 1 Zeichen enthält.
Nimrod Shory

Stellen Sie außerdem sicher, dass Ihre Zeichenfolge immer mit dem Zeichen endet, das Sie entfernen möchten. EG: "Hello! World" würde als "Hello! Worl" enden.
Nathan Koop

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

oder

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

... für den Fall, dass Sie ein Nicht-Leerzeichen am Ende entfernen möchten.


9
Ich habe mich dafür entschieden, nur um die Abwertung ohne Kommentar auszugleichen. Hasse es, wenn Leute das tun.
Jeff Reddy

2
Dies könnte daran liegen, dass es keine TrimEnd()Methode gibt, und wenn dies der Fall wäre, könnte der nachfolgende Substring(..)Aufruf bei kurzen Zeichenfolgen fehlschlagen.
Rory

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

Wie arbeite ich mit Endswith Property? kann es hier verwendet werden?
userAZLogicApps

1
Trim () ist so schlecht benannt. Es schneidet alle führenden und nachfolgenden Zeichen (Plural), ebenso wie TrimStart () und TrimEnd ()
Antony Booth


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

5

Das andere Beispiel für das Trimmen des letzten Zeichens aus einer Zeichenfolge:

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

Sie können es in eine Erweiterungsmethode einfügen und verhindern, dass es eine Nullzeichenfolge usw. enthält.


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

2

Sie können dies auch verwenden:

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

Leicht modifizierte Version von @Damian Leszczyński - Vash, die sicherstellt, dass nur ein bestimmter Charakter entfernt wird.

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

Ich habe den Weg eingeschlagen, eine Erweiterung mit TrimEnd zu schreiben, nur weil ich sie bereits inline verwendet habe und damit zufrieden war ... dh:

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);
        }

}

Stellen Sie sicher, dass Sie den Namespace mithilfe der statischen Klasse in Ihre Klassen aufnehmen. P und Verwendung sind:

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

0

Sehr einfach und unkompliziert:

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


0

Ein Beispiel für eine Erweiterungsklasse zur Vereinfachung: -

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;
}

Verwendung

"!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

Wenn Sie das '!' Zeichen aus einem bestimmten Ausdruck (in Ihrem Fall "Welt"), dann können Sie diesen regulären Ausdruck verwenden

string input = "Hello! world!";

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

// result: "Hello! world"

Das Sonderzeichen $ 1 enthält alle übereinstimmenden "Welt" -Ausdrücke und wird verwendet, um die ursprüngliche "Welt" zu ersetzen. Ausdruck

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.