Обріжте останній символ із рядка


157

Я маю на увазі рядок

"Hello! world!" 

Я хочу зробити обрізку або видалити, щоб вийняти! від світу, але не від Привіт.


1
Можливо, це виходить за межі вашого запиту, але чи можу я попросити вас задуматися про використання запропонованого нами регулярного виразу?
Marcello Faga

Відповіді:


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

читати більше

Редагувати:

Що я помітив у цьому типі запитань, які досить всі пропонують видалити останній знак заданої рядки Але це не відповідає визначенню методу Trim.

Обрізання - видаляє всі виникнення символів пробілу з початку та кінця цього примірника.

MSDN-Trim

За цим визначенням видалення лише останнього символу з рядка є поганим рішенням.

Отже, якщо ми хочемо "Обрізати останній символ із рядка", нам слід зробити щось подібне

Приклад як метод розширення:

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

Зверніть увагу, якщо ви хочете видалити всі символи одного і того ж значення, тобто (!!!!) метод вище видаляє всі існування '!' з кінця рядка, але якщо ви хочете видалити лише останній символ, вам слід скористатися цим:

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

1
Це краще, якщо ви завжди знаєте, якого символу ви хочете видалити з кінця рядка.
Німрод Шорі

1
Привіт Vash, що ти думаєш про моє рішення за допомогою RegEx? Він виконує запит Thqr і дозволяє видалити "!" char від будь-якого "світу!" вираз, де б не було розміщено вираз, лише в одному рядку коду.
Marcello Faga

24
-1 Це рішення видалить усі ті самі символи, що закінчуються! Наприклад, вийшло б "Привіт !!!!!!!!" в "Привіт", який видаляє більше, ніж останній символ.
Кугель

1
@Kugel, Ти маєш абсолютно право, і тому ти повинен ще раз прочитати мою відповідь. Для пояснення OP не запитуйте, як видалити останній символ, а як його обрізати.
Damian Leszczyński - Vash

1
@Vash - як видалити єдину цитату "за допомогою методу -" Привіт! Світ! ". TrimEnd ('!');
Steam

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

14
Просто переконайтеся, що вашаString містить щонайменше 1 символ.
Німрод Шорі

також переконайтеся, що ваш рядок завжди закінчується символом, який ви хочете видалити EG: "Hello! World" закінчиться як "Hello! Worl".
Натан Куп

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

або

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

... у випадку, якщо ви хочете видалити символ, який не пробігає, з кінця.


9
Я висловився за те, щоб просто компенсувати потік без коментарів. Ненавиджу, коли це роблять люди.
Джефф Редді

2
Це може бути тому, що TrimEnd()методу немає, і якщо він є, це може зробити наступний Substring(..)виклик невдалим на коротких рядках.
Рорі

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

як працювати з власністю endwith? чи можна його тут використовувати?
користувачAZLogicApps

1
Trim () так погано названий. Він обрізає всіх провідних та кінцевих персонажів (множини), як і TrimStart () та TrimEnd ()
Ентоні Бут


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

5

Ще один приклад обрізки останнього символу з рядка:

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

Ви можете помістити його в метод розширення і запобігти нульовому рядку тощо.



2

Ви також можете скористатися цим:

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

Трохи модифікована версія @Damian Leszczyński - Vash, яка забезпечить видалення лише конкретного символу.

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

Я взяв шлях написання розширення за допомогою TrimEnd тільки тому, що я вже використовував його вбудований і був задоволений ним ... тобто:

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

}

Переконайтеся, що ви включили у свої класи простір імен за допомогою статичного класу; P та використання:

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

0

Приклад класу розширення для спрощення цього: -

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

Використання

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

Якщо ви хочете видалити "!" символу з конкретного виразу ("світ" у вашому випадку), тоді ви можете використовувати цей регулярний вираз

string input = "Hello! world!";

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

// result: "Hello! world"

спеціальний символ $ 1 містить усі відповідні вирази "світу", і він використовується для заміни початкового "світу!" вираз

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.