2015-12-20 2 views
3

Учитывая следующие строки:режим Regex Ленивый не работает, как ожидалось

FFSMQWUNUPZRJMTHACFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDADYSORTYZQPWGMBLNAQOFODSNXSZFURUNPMZGHTA 

Я пытаюсь соответствовать каждой подстроки, которая содержит CABDA со следующим регулярным выражением:

C.*?A.*?B.*?D.*?A 

Единственное, что Я нахожу тогда

CFELGHDZEJWFDWVPYOZEVEJKQWHQAHOCIYWGVLPSHFESCGEUCJGYLGDWPIWIDWZZXRUFXERABQJOXZALQOCSAYBRHXQQGUDA 

Это само по себе не так - но я должен найти CSAYBRHXQQGUDA

Что мне не хватает?

Вы можете проверить его here, если вы хотите

Любая помощь приветствуется.

+1

Вот как должны работать регулярные выражения. Они ищут * первый * матч, а не самый короткий *. Лень не изменяет этого поведения, он просто будет стремиться к совпадению кратчайшего * всех строк, которые начинаются там *. –

+0

@CommuSoft Я тоже пытался с группами. Разве я не должен получать все матчи? –

+0

@ Nilzone - вы будете, если будете использовать 'lookahead'. – vks

ответ

0
(?=(C.*?A.*?B.*?D.*?A)) 

Поместите выражение внутри lookahead, чтобы получить все matches.See Demo

https://regex101.com/r/fM9lY3/46

Если вы хотите, чтобы найти только кратчайшим вы можете использовать

C(?:(?!C|A|B|D).)*A(?:(?!C|A|B|D).)*B(?:(?!C|A|B|D).)*D(?:(?!C|A|B|D).)*A 
+0

Ваше регулярное выражение ужасно. '(? :(?! C | A | B | D).) *' Можно переписать как '[^ CABD] *'. – nhahtdh

+0

@nhahtdh Я предполагал, что у ОП должна быть сложная проблема ...как некоторые строки вместо простого ABCD – vks

+0

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

2

Ленивый квантор Безразлично 't означает, что он попытается сопоставить наименьшую подстроку. Это просто означает, что он попытается сопоставить как можно меньше персонажей и вернуться к большему количеству символов, в отличие от того, чтобы соответствовать как можно большему количеству символов, и отступать к меньшему.

Поиск позиции остается прежней - первая слева направо. Например:

x+?y 

когда сопоставляется:

xxxy 

будет по-прежнему соответствовать xxxy и не только xy, так как он был в состоянии начать с первого x и вернуться назад к более x эс.

1

Вы можете использовать это регулярное выражение на основе класса отрицания:

/C[^C]*?A[^A]*?B[^B]*?D[^D]*?A/ 

RegEx Demo

Это находит CSAYBRHXQQGUDA в вашем данном входе.

Смежные вопросы