Как удалить одинокие 1, если за ними следует любое письмо с регулярным выражением? - PullRequest
2 голосов
/ 27 февраля 2020

Проблема:

Вход: 1b-12

Выход: b-2

Желаемый выход: b-12

Код, который я сейчас использую:

Regex.Replace("1b-12", @"\b1(\w+)\b", @"$1", RegexOptions.IgnoreCase);

Вопрос:

Как мне исправить свое регулярное выражение, чтобы сделать 1b = b, но оставить 11b как 11b и 11 как 11?

Спасибо за любую помощь.

1 Ответ

7 голосов
/ 27 февраля 2020

Поскольку \w соответствует буквам, цифрам, подчеркиванию и некоторым комбинированным знакам, вы должны использовать \p{L} или - если вам нужно разрешить только буквы ASCII - [a-zA-Z].

Пример решения, которое соответствует 1 в начале слова и содержит 1+ букв:

Regex.Replace("1b-12", @"\b1(?=\p{L}+\b)", "")
Regex.Replace("1b-12", @"\b1(?=[a-zA-Z]+\b)", "")

См. регулярное выражение demo . Обратите внимание, что вам не нужно RegexOptions.IgnoreCase, поскольку \p{L} и [a-zA-Z] совпадают как с заглавными, так и с заглавными буквами.

Подробности

  • \b - здесь , начало слова
  • 1 - 1 char
  • (?=\p{L}+\b) - сразу за ним следуют 1+ буквы и затем конец слова. Кроме того, поскольку это шаблон предварительного просмотра, который не использует символы, ваш шаблон замены может оставаться пустым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...