2013-08-14 3 views
5

Если я пишурегулярное выражение - путать о функциональности lookaround

(?<=\()\w+(?=\)) 

для этой строки: (Test) (Test2) (Test3)

я получаю: Тест Test2 Test3

Это имеет смысл ,

Если я пишу

\w+ (?<=\()\w+(?=\)) 

Для этой строки: LTE (Test)

не возвращает ничего .. Что здесь проблема?

Пожалуйста, объясните свое регулярное выражение, потому что его трудно прочитать.

+0

use http://gskinner.com/RegExr/: наведите указатель мыши на свой код регулярного выражения, чтобы увидеть четкое объяснение. См. Также http://regex101.com/r/zE8qZ8 – hexicle

+0

Я использовал regexr, чтобы проверить это в первую очередь. все еще не дает мне понять, почему он не работает – hamobi

ответ

5

Образцы не употребляют символы!

Вот шаг за шагом путь, чтобы увидеть его (не может быть лучше, но это, как я интерпретирую это так или иначе):

Первый символ L, движок регулярных выражений сравнивает его с \w+ и соглашается с тем, что это совпадение. То же самое происходит для T, затем E.

В пространстве двигатель регулярных выражений видит пространство в регулярном выражении, это прекрасно.

Следующий шаг - это начальный палец, но что видит реджикс? Помните, что начертания не потребляют персонажей, так что \( в (?<=\() на самом деле не потребляется, а \( не соответствует вашим \w+ матчам!

Вы можете подумать о регулярном выражении, которое использует эти символы: \w+ \w+, но с условием на втором \w+, что оно должно быть найдено между parens. Условие может быть выполнено, но само выражение не соответствует круглым скобкам!

Для того, чтобы он соответствовал, вы должны добавить скобки:

\w+ \((?<=\()\w+(?=\))\) 

После просмотра и согласования пространства, движок регулярных выражений видит (, что согласуется с представленным выражением, она двигается вперед.

Двигатель затем видит T. Во-первых, соответствует ли он следующему символу, \w+? Да, во-вторых, есть ли перед ним открывающий парик? Да.

Перед тем, как двигаться вперед, он видит положительный взгляд. Есть ли только парашют закрытия? Нет, есть e, но \w+ все еще может быть удовлетворен, поэтому он соответствует e с другим \w. Это продолжается до t. Есть ли закрывающий палец после t? Да, перейдем к следующей проверке.

Он встречает заключительный параграф, который совпадает с заключительным парсом в выражении (обратите внимание, что буквальный палец закрытия здесь можно отбросить, и вместо этого вы будете сопоставлять LTE (Test).

Но при всем этом, это может быть так же хорошо, что уронила lookarounds:

\w+ \(\w+\) 

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

Надеюсь, это поможет, даже если это немного!

+0

, так что в принципе .. искаженный can not действительно используется в центре регулярного выражения? в моем первом примере я получаю все «тесты» без скобок, но я не получил бы LTE. Если я хочу LTE, то я должен просто прямо заявить, что есть скобки? Я не понимаю. – hamobi

+0

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

2

Lookahead and lookbehind "zero-width assertions", они не потребляют символов в строке, а только утверждают, возможно ли совпадение или нет. Ваш второй образец пытается найти структуру <word1><space><word2>, но это также ожидает, что <word2> окружен круглыми скобками. Он не будет соответствовать ни на чем, так как единственный символ, который он принимает до <word2>, является <space>! Я просто написал скобки прямо в шаблон: (\w+) \((\w+)\). Я попробовал, и это дает мне LTE и Test.