Utnij ostatni znak z ciągu


157

Mam do powiedzenia ciąg

"Hello! world!" 

Chcę przyciąć lub usunąć, aby wyjąć! poza światem, ale nie poza światem Witam.


1
Może wykracza to poza twoją prośbę, ale czy mogę poprosić Cię o chwilę zastanowienia się nad użyciem zaproponowanego przeze mnie wyrażenia regularnego?
Marcello Faga

Odpowiedzi:


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

Czytaj więcej

EDYTOWAĆ:

To, co zauważyłem w tego typu pytaniach, to że całkiem każdy sugeruje usunięcie ostatniego znaku z danego ciągu. Ale to nie spełnia definicji metody przycinania.

Przytnij - usuwa wszystkie wystąpienia białych znaków z początku i końca tej instancji.

MSDN-Trim

Zgodnie z tą definicją usunięcie tylko ostatniego znaku z łańcucha jest złym rozwiązaniem.

Więc jeśli chcemy „Przyciąć ostatni znak z łańcucha”, powinniśmy zrobić coś takiego

Przykład jako metoda rozszerzenia:

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

Zauważ , że jeśli chcesz usunąć wszystkie znaki o tej samej wartości, tj. (!!!!) powyższa metoda usuwa wszystkie istnienia '!' od końca ciągu, ale jeśli chcesz usunąć tylko ostatni znak, użyj tego:

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

1
Jest to lepsze, o ile zawsze wiesz, jaki znak chcesz usunąć z końca ciągu.
Nimrod Shory

1
Cześć Vash, co myślisz o moim rozwiązaniu używającym RegEx? Spełnia żądanie Thqr i pozwala usunąć znak '!' char z dowolnego „świata!” wyrażenie, gdziekolwiek zostanie umieszczone wyrażenie, w jednej linii kodu.
Marcello Faga

24
-1 To rozwiązanie usunie wszystkie te same znaki końcowe! Np. Zmieniłoby się „Cześć !!!!!!!!” w "Hello", które usuwa więcej niż ostatni znak.
Kugel

1
@Kugel, masz całkowitą rację i dlatego powinieneś przeczytać jeszcze raz moją odpowiedź. Dla wyjaśnienia OP nie pytaj, jak usunąć ostatni znak, ale jak go przyciąć.
Damian Leszczyński - Vash

1
@Vash - jak usunąć pojedynczy cudzysłów 'za pomocą metody - "Hello! World!". TrimEnd ('! ');
Steam

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

14
Upewnij się tylko, że yourString zawiera co najmniej 1 znak.
Nimrod Shory

upewnij się również, że ciąg zawsze kończy się znakiem, który chcesz usunąć. EG: „Hello! World” kończy się jako „Hello! Worl”.
Nathan Koop

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

lub

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

... na wypadek, gdybyś chciał usunąć z końca znak niebędący białymi znakami.


9
Głosowałem za tym, aby zrównoważyć głos przeciw bez komentarza. Nienawidzę, kiedy ludzie to robią.
Jeff Reddy,

2
Mogło tak być, ponieważ nie ma TrimEnd()metody i gdyby tak było, mogłoby to spowodować Substring(..)niepowodzenie kolejnego wywołania na krótkich ciągach.
Rory

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

jak pracować z właściwościami endwith? czy można go tutaj użyć?
userAZLogicApps

1
Trim () jest tak źle nazwany. Obcina wszystkie znaki wiodące i końcowe (liczba mnoga), podobnie jak TrimStart () i TrimEnd ()
Antony Booth


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

5

Kolejny przykład przycinania ostatniego znaku z ciągu:

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

Możesz umieścić go w metodzie rozszerzającej i uniemożliwić jej tworzenie ciągów zerowych itp.


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

2

możesz również użyć tego:

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

Bardzo łatwe i proste:

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


1

Nieznacznie zmodyfikowana wersja @Damian Leszczyński - Vash, która zapewni usunięcie tylko określonej postaci.

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

Podjąłem ścieżkę pisania rozszerzenia za pomocą TrimEnd tylko dlatego, że już używałem go w tekście i byłem z niego zadowolony ... tj:

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

}

Upewnij się, że umieszczasz przestrzeń nazw w swoich klasach przy użyciu klasy statycznej; P, a użycie to:

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

0

Przykładowa klasa rozszerzenia, aby to uprościć: -

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

Stosowanie

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

Jeśli chcesz usunąć znak „!” znaku z określonego wyrażenia (w twoim przypadku „świata”), możesz użyć tego wyrażenia regularnego

string input = "Hello! world!";

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

// result: "Hello! world"

znak specjalny $ 1 zawiera wszystkie pasujące wyrażenia „świat” i jest używany do zastąpienia oryginalnego słowa „świat!” wyrażenie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.