?
в этом контексте является специальным оператором для операторов повторения (+
, *
и ?
). В движках, где это доступно, это делает повторение ленивым или нежадным или неохотным или другими подобными терминами. Обычно повторение является жадным, что означает, что оно должно совпадать как можно больше. Таким образом, в большинстве современных perl-совместимых движков у вас есть три типа повторения:
.* # Match any character zero or more times
.*? # Match any character zero or more times until the next match (reluctant)
.*+ # Match any character zero or more times and don't stop matching! (possessive)
Дополнительную информацию можно найти здесь: http://www.regular-expressions.info/repeat.html#lazy для неохотных/ленивых и здесь: http://www.regular-expressions.info/possessive.html для притяжательного (которое я пропущу в этом ответе).
Предположим, у нас есть строка aaaa
. Мы можем сопоставить все a с /(a+)a/
. Буквально это
соответствует одному или нескольким a
, за которыми следует a
.
Это будет соответствовать aaaa
. Регулярное выражение является жадным и будет соответствовать как можно большему количеству a
. Первое подсовпадение aaa
.
Если мы используем регулярное выражение /(a+?)a
, это
неохотно совпадать с одним или несколькими a
, за которыми следует a
или
совпадать с одним или несколькими a
, пока не будет найдено другое a
То есть соответствовать только тому, что нам нужно. Таким образом, в этом случае совпадение равно aa
, а первое подсовпадение — a
. Нам нужно только сопоставить одно a
, чтобы выполнить повторение, а затем за ним следует a
.
Это часто возникает при использовании регулярных выражений для сопоставления внутри тегов html, кавычек и тому подобного - обычно зарезервировано для быстрых и грязных операций. То есть использование регулярного выражения для извлечения из очень больших и сложных строк html или строк в кавычках с escape-последовательностью может вызвать много проблем, но это прекрасно подходит для конкретных случаев использования. Итак, в вашем случае имеем:
/Dev/videos/1610110089242029/
Выражение должно соответствовать videos/
, за которым следует ноль или более символов, за которыми следует /"
. Если там есть только один URL-адрес видео, это нормально, без нежелания.
Однако у нас есть
/videos/1610110089242029/" ... ajaxify="/Dev/videos/1610110089242029/"
Без нежелания регулярное выражение будет соответствовать:
1610110089242029/" ... ajaxify="/Dev/videos/1610110089242029
Он пытается максимально соответствовать друг другу, и /
и "
прекрасно удовлетворяют .
. С неохотой сопоставление останавливается на первых /"
(на самом деле происходит откат, но об этом можно прочитать отдельно). Таким образом, вы получаете только ту часть URL, которая вам нужна.
person
Explosion Pills
schedule
10.09.2015
.
), любое количество раз (*
), как можно меньшее количество раз (?
) (не жадный). - person Sebastian Simon   schedule 10.09.2015