Соответствует началу или концу строки - но указывайте шаблон только один раз - PullRequest
3 голосов
/ 11 апреля 2020

Хорошо, это в основном интеллектуальный вопрос (или улучшение).

У меня есть шаблон, который должен соответствовать либо началу, либо концу строки (или обоим).

(Здесь я просто используйте 'abcd' в качестве шаблона, но в реальном мире это довольно длинный и сложный шаблон. Однако это не интересно, так как он работает).

Как обычно, я использую это регулярное выражение:

@"^abcd|abcd$"

Здесь шаблон дублируется, один раз для начала и один раз для конца строки.

Однако, поскольку шаблон длинный и сложный, я бы хотел укажите это только один раз в строке . Это помогло бы как в чтении, так и в поддержании - у меня было бы только одно место для изменения.

Следующие регулярные выражения, конечно, не работают, но дают представление о том, что я хочу:

@"^abcd$" - matches only 'abcd' exact
@"^?abcd$?" - matches also 'abcd' in the middle

Итак, вопрос в следующем:

Есть ли способ сопоставить начало или конец строки и указать только один внутренний шаблон?

1 Ответ

5 голосов
/ 11 апреля 2020

Вы можете использовать

(^)?abcd(?(1)|$)

См. Демоверсию regex .

Подробности

  • (^)? - необязательная группа захвата, ее значение будет пустой строкой, если позиция совпала, или ноль иначе
  • abcd - ваше значение
  • (?(1)|$) - условная конструкция: if Group 1 значение не равно NULL (если оно было найдено), тогда ничего не делайте, иначе сопоставьте конец строки.

См. C# demo :

var strings = new List<string> { "1 abcd", "abcd 1", "1 abcd 1"};
var pattern = "(^)?abcd(?(1)|$)";
foreach (var s in strings)
{
    Console.WriteLine("{0} => {1}", s, Regex.IsMatch(s, pattern));
}

Выход:

1 abcd => True
abcd 1 => True
1 abcd 1 => False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...