Регулярное выражение для удаления конкретной строки, если существует

1

Я хочу удалить -L с конца моей строки, если существует

Так

ABCD   => ABCD
ABCD-L => ABCD

на данный момент я использую что-то вроде строки ниже, которая использует тип размещения if/else в моем Regex, однако у меня есть ощущение, что это будет намного проще, чем это.

var match = Regex.Match("...", @"(?(\S+-L$)\S+(?=-L)|\S+)");
  • 2
    и string.Replace and string.Contains не будут работать для вас ..? String.Replace (строка, строка)
  • 0
    это часть довольно большого регулярного выражения, которое, если я захочу разбить его на ac # код, будет преобразовано в достаточное количество строк. Вот и все.
Показать ещё 7 комментариев
Теги:
string

4 ответа

4
Лучший ответ

Как насчет того, чтобы делать:

Regex rgx = new Regex("-L$");
string result = rgx.Replace("ABCD-L", "");

Итак, в основном: если строка заканчивается на -L, замените эту часть пустой строкой.

Если вы хотите не только вызвать замену в конце строки, но и в конце слова, вы можете добавить дополнительный переключатель для обнаружения границ слов (\b) в дополнение к концу строки:

Regex rgx = new Regex("-L(\b|$)");
string result = rgx.Replace("ABCD-L ABCD ABCD-L", "");

Обратите внимание, что обнаружение границ слов может быть немного неоднозначным. См. Здесь список символов, которые считаются символами слова в С#.

  • 0
    Replace работает только когда rgx.Sucess имеет значение true ?
  • 0
    @ Mehrad Что такое rgx.Sucess ? Не могу найти эту собственность нигде. В любом случае, если ничего не найдено, ничто не заменяется.
Показать ещё 1 комментарий
2

Вы также можете использовать метод String.Replace(), чтобы найти определенную строку внутри строки и заменить ее другой строкой в этом случае пустой строкой.

http://msdn.microsoft.com/en-us/library/fk49wtc1(v=vs.110).aspx

1

Вы, конечно, можете использовать Regex для этого, но почему при использовании обычных строковых функций яснее?

Сравните это:

text = text.EndsWith("-L")
    ? text.Substring(0, text.Length - "-L".Length)
    : text;

к этому:

text = Regex.Replace(text, @"(\S+?)-L(?=\s|$)", "$1");

Или еще лучше, определите метод расширения следующим образом:

public static string RemoveIfEndsWith(this string text, string suffix)
{
    return text.EndsWith(suffix)
        ? text.Substring(0, text.Length - suffix.Length)
        : text;
}

Тогда ваш код может выглядеть так:

text = text.RemoveIfEndsWith("-L");

Конечно, вы всегда можете определить метод расширения с помощью Regex. По крайней мере, ваш код вызова выглядит намного чище и гораздо читабельнее и удобнее.

  • 0
    Ваше сравнение неверно. Вы должны сравнить свое решение с new Regex("-L$").Replace(text, "");
  • 0
    @RobbyCornelissen - этот код, безусловно, лучше, чем Regex, который я использовал, но он все еще менее очевиден в отношении того, что он делает.
1

Используйте функцию Regex.Replace,

Regex.Replace(string, @"(\S+?)-L(?=\s|$)", "$1")

DEMO

Объяснение:

(                        group and capture to \1:
  \S+?                     non-whitespace (all but \n, \r, \t, \f,
                           and " ") (1 or more times)
)                        end of \1
-L                       '-L'
(?=                      look ahead to see if there is:
  \s                       whitespace (\n, \r, \t, \f, and " ")
 |                        OR
  $                        before an optional \n, and the end of
                           the string
)                        end of look-ahead

Ещё вопросы

Сообщество Overcoder
Наверх
Меню