2015-06-11 4 views
0

Согласно следующему answer на Stack Overflow: (?. = * Баз)Regex И оператор не работает

(?. = * Foo)

Это говорит о том, чтобы регулярное выражение, что Foo должен появиться где угодно, и baz должен появляться где угодно, не обязательно в этом порядке и, возможно, перекрываться.

Это регулярное выражение должно соответствовать этим словам Foo и База:

Where foo have baz all my life 

Однако это не работает. Не в regexr ни в regexpal.com.

+0

Что-то вроде: https://regex101.com/r/rS8sK6/1? –

+0

@ ʰᵈˑ: Отлично! Вы можете объяснить мне это выражение, пожалуйста? –

ответ

1

Вам нужно создать группу захвата вокруг foo и baz, потому что lookaround не захват группы, а утверждение.

Сам взгляд не является группой захвата. Он не включен в число count для нумерации обратных ссылок. Если вы хотите сохранить совпадение регулярного выражения внутри lookahead, вам нужно поместить скобки для скобок вокруг регулярного выражения внутри lookahead, например: (? = (Regex)). Другой способ не будет работать, потому что lookahead уже отменил бы соответствие регулярному выражению к тому времени, когда группа захвата сохранит его соответствие.

http://www.regular-expressions.info/lookaround.html

Сделайте регулярное выражение:

(?=.+?(foo))(?=.+?(baz)) 

Примечание захвата группы в упреждающей выборке.

https://regex101.com/r/rS8sK6/1

+0

Получил. Но если вы начинаете с foo; он не работает. –

+0

Это из-за положительного взгляда. Это требует хотя бы одного символа раньше (потому что я сделал квантификатор «+?» - * my bad *). Если вы измените '+?' После '.', на квантификатор' * ', то он будет: https://regex101.com/r/rS8sK6/2 –

+0

Спасибо. Все работает сейчас. Любая идея, почему http://regexpal.com/ не работает для этого выражения? –

1

Lookarounds - это только утверждения, которые не будут соответствовать ни одному символу.

(?=.*foo)(?=.*baz) 

утверждает, что линия, где матч будет должен содержать случилось foo и baz строки. И я предлагаю вам использовать якоря вместе с вышеупомянутыми образами.

^(?=.*foo)(?=.*baz) 

Это граница, которая существует в начале строки.

Адрес, где было предложено вышеперечисленное выражение?

Это полезно, если вы хотите, чтобы напечатать всю строку, в которой строки foo и baz появляется.

В JS, вы могли бы написать

/^(?=.*foo)(?=.*baz)/m.test(string); 
0

Если есть только две строки, которые вы ищете, вы можете сделать:

(XXX. * YYY) | (. YYY * XXX)

Он будет искать XXX и YYY в одной строке в обоих порядках.

Возможно, не эффективен, но он прост и работает.

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