Regex - предположение - PullRequest
       0

Regex - предположение

9 голосов
/ 26 сентября 2010

У меня проблема с предварительным утверждением (? =).Например, у меня есть выражение:

/Win(?=2000)/

Это соответствует Win, если выражение похоже на Win2000, Win2000fgF.У меня есть следующее выражение:

^(?=.*\d)(?=.*[a-z]).*$

Соответствует цифре и строчной букве, например: 45dF, 4Dd.Но я не знаю, почему это работает и соответствует всем персонажам :) У меня нет символов, которые были до (?=.*\d).Я думаю, должно работать только это выражение:

^.\*(?=.*\d)(?=.*[a-z]).*$

\* перед выражением).

Не могли бы вы объяснить это?

Ответы [ 2 ]

39 голосов
/ 26 сентября 2010

Допустим, мы являемся движком регулярных выражений и применим регулярное выражение ^(?=.*\d)(?=.*[a-z]).*$ к строке 2a.

Начиная с позиции 0 (перед первым символом):

  1. ^: убедитесь, что мы в начале строки: OK
  2. (?=: давайте проверим, может ли соответствовать следующее регулярное выражение ...
  3. .*: совпадать с любым количеством символов -> 2a. OK.
  4. \d: Нет, мы уже в конце. Вернемся к одному символу: a -> Нет, не соответствует. Вернитесь еще один: 2 -> MATCH!
  5. ): конец просмотра, совпадение успешно. Мы все еще в позиции 0!
  6. (?=: давайте проверим, может ли следующее регулярное выражение соответствовать ...
  7. .*: совпадать с любым количеством символов -> 2a. OK.
  8. [a-z]: Нет, мы уже в конце. Вернемся к одному символу: a -> MATCH!
  9. ): Конец предвидения, совпадение успешно. Мы все еще в позиции 0!
  10. .*: соответствует любому количеству символов -> 2a -> MATCH!
  11. $: Давайте посмотрим - мы в конце строки? Да, мы! -> МАТЧ!
  12. Эй, мы достигли конца регулярного выражения. Отлично. Матч завершен!
4 голосов
/ 26 сентября 2010

Lookaheads не соответствуют, они утверждают.

это означает, что если вы используете Lookahead, вам нужно что-то, что будет соответствовать тому, что вы хотите, если вы хотите пойти дальше.

...