Регулярное выражение - предварительное утверждение

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

/Win(?=2000)/

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

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

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

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

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

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


person luk4443    schedule 26.09.2010    source источник


Ответы (2)


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

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

  1. ^: Убедитесь, что мы в начале строки: ОК
  2. (?=: Давайте проверим, соответствует ли следующее регулярное выражение ...
  3. .*: соответствует любому количеству символов -> 2a. OK.
  4. \d: Нет, мы уже в конце. Вернемся на один символ назад: a -> Нет, не совпадает. Вернитесь еще раз: 2 -> MATCH!
  5. ): конец просмотра вперед, совпадение выполнено успешно. Мы все еще на нулевой позиции!
  6. (?=: Давайте проверим, соответствует ли следующее регулярное выражение ...
  7. .*: соответствует любому количеству символов -> 2a. OK.
  8. [a-z]: Нет, мы уже в конце. Вернемся на один символ назад: a -> MATCH!
  9. ): конец просмотра вперед, совпадение выполнено успешно. Мы все еще на нулевой позиции!
  10. .*: совпадать с любым количеством символов -> 2a -> СООТВЕТСТВОВАТЬ!
  11. $: Посмотрим - мы в конце строки? Да, мы! -> МАТЧ!
  12. Эй, мы достигли конца регулярного выражения. Большой. Матч завершен!
person Tim Pietzcker    schedule 26.09.2010
comment
Спасибо за отличное объяснение. Не могли бы вы мне сказать, почему ^ (? =. * \ D) (? =. * [A-z]) $ (без. * В конце) не работает для 2a? Это регулярное выражение должно соответствовать? - person luk4443; 26.09.2010
comment
Что ж, представьте, что вы пропустили шаг 10 - механизм регулярных выражений все еще находится в позиции 0, поэтому он не может сопоставить $. - person Tim Pietzcker; 26.09.2010

они утверждают, что опережающие попытки не совпадают.

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

person muhmuhten    schedule 26.09.2010