`regex {n,}?` == `regex {n}`? - PullRequest
3 голосов
/ 06 июля 2010

-edit- ПРИМЕЧАНИЕ ? в конце .{2,}?

Я обнаружил, что вы можете написать

.{2,}?

Разве это не так же, как показано ниже?

.{2}

Ответы [ 7 ]

18 голосов
/ 06 июля 2010

Нет. {2,} означает два раза или более, в то время как {2} означает точно два раза. Квантификаторы по умолчанию жадные, поэтому, учитывая строку foo, вы получите foo, если вы используете .{2,}, но fo, если вы используете .{2,}?, потому что вы сделали его ленивым. Однако для последнего разрешено совпадать более двух раз, если необходимо, но .{2} всегда означает точно два символа.

Таким образом, если у вас есть строка test123 и шаблон .{2,}?\d, вы получите test1, потому что он должен соответствовать до четырех символов, чтобы \d также мог совпадать.

6 голосов
/ 06 июля 2010

Нет, они разные.^.{2,}?$ соответствует строкам, длина которых не менее 2 ( как видно на rubular.com ):

12
123
1234

В отличие от ^.{2}$ соответствует только строкидлина которого точно 2 (, как видно на rubular.com ).

Правильно, что, неохотно, .{2,}? сначала попытается сопоставить только два символа.Но для соответствия общего шаблона может потребоваться больше.Это не относится к .{2}, который может соответствовать только 2 символам.

Ссылки

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

3 голосов
/ 06 июля 2010

В отдельности они, вероятно, ведут себя идентично, но не внутри больших выражений, потому что ленивая версия может соответствовать более двух символов.

             abx        abcx

^.{2,}?x$    match      match
^.{2}x$      match      no match
2 голосов
/ 06 июля 2010

Что делает этот вопрос особенно интересным, так это то, что бывают раза, когда .{2,}? эквивалентно .{2}, но это никогда не должно происходить. Другие уже указали, как неохотный квантификатор в самом конце регулярного выражения всегда соответствует минимальному количеству символов, потому что после него нет ничего, что заставляло бы его потреблять больше.

Другое место, где их не следует использовать, находится в конце подвыражения внутри атомной группы . Например, предположим, что вы пытаетесь сопоставить foo bar с

f(?>.+?) bar

Подвыражение первоначально потребляет первое 'o' и передает следующую часть, которая безуспешно пытается найти пробел. Без атомарной группы она вернулась бы назад и позволила бы .+? потреблять другой символ. Но он не может вернуться в атомарную группу, и у него нет комнаты для маневра до группы, поэтому попытка совпадения не удалась.

Нежелательный квантификатор в конце регулярного выражения или в конце атомного подвыражения - это определенный запах кода.

0 голосов
/ 06 июля 2010

Нет, они разные:

.{2,}?: любой символ, минимум 2 повторения, как можно меньше

.{2}: любой символ, ровно 2 повторения

0 голосов
/ 06 июля 2010

x.{2,}?x соответствует "xasdfx" в "xasdfxbx", но x.{2}x не соответствует вообще.

Без завершающего ? первое будет соответствовать всей строке.

0 голосов
/ 06 июля 2010

Не совсем Использование PHP для сопоставления регулярных выражений и отображения захвата

<code>$string = 'aaabbaabbbaaa';

$search = preg_match_all('/b{2}a/',$string,$matches,PREG_SET_ORDER );

echo '<pre>';
var_dump($matches);
echo '
'; $ search = preg_match_all ('/ b {2,}? a /', $ string, $ match, PREG_SET_ORDER); echo '
';
var_dump($matches);
echo '
';

Первый результат дает:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(3) "bba"
  }
  [1]=>
  array(1) {
    [0]=>
    string(3) "bba"
  }
}

секунда дает:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(3) "bba"
  }
  [1]=>
  array(1) {
    [0]=>
    string(4) "bbba"
  }
}

При b {2} захват возвращает только 2 b, при b {2,} он возвращает 2 или более

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...