В этом ниже регулярном выражении:
1.*(aaa|ccc)
Тестовая строка
1aaaccc
Есть только один матч с группой 1 ccc. Но должно быть два совпадения ааа и ссс
1 ответ
Зависит от того, что вы ищете; Шаблон "1.*(aaa|ccc)" извлечет две группы:
«1aaaccc»: «1» + любые символы + «ccc». 'ccc' выбрано как 'жадное' соответствие по умолчанию: извлечь как можно больше.
"ccc" - потому что "ccc" находится в "группе захвата". Вы можете подавить это, изменив шаблон на "1.*(?:aaa|ccc)". Это «ccc», а не «aaa», потому что оно представляет собой часть уже существующего совпадения. Все необязательные совпадения после первого являются фрагментами первого.
Если убрать ".*", то "ccc" станет неактуальным и будут "1aaa" и "aaa". Если вы хотите получить как "aaa", так и "ccc", шаблон должен быть "1(aaa)(ccc)". Результат будет: "1aaaccc", "aaa", "ccc". Но это может быть не то, что вам нужно: строка «1xxxccc» не будет соответствовать ничему.
Это для регулярного выражения .NET, другие варианты, скорее всего, дадут тот же результат. Надеюсь, мое описание имеет смысл :)
the first one
— это полное совпадение, формально это не группа захвата. На самом деле известен как the match
.
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки строк, разбора и преобразования. Укажите язык (PHP, Python и т. д.) или инструмент (grep, VS Code, Google Analytics и т. д.), который вы используете. Не размещайте вопросы, требующие объяснения того, что означает символ или чему будет соответствовать конкретное регулярное выражение.
(|)
— это чередование, поэтому вы соответствуете либоaaa
, либоccc
. Поскольку вы указали1.*(aaa|ccc)
, оно будет соответствовать1aaaccc
, захватываяccc
, поскольку регулярное выражение хочет соответствовать как можно большему числу. Точно так же изменение его на1.*?(aaa|ccc)
(ленивое сопоставление) будет соответствовать только1aaa
. Я думаю, что вы ищете, возможно,1.*(a{3})(c{3})