Соответствуют ли обе альтернативы при использовании | в Perl регулярные выражения? - PullRequest
3 голосов
/ 01 сентября 2011

Я смущен по поводу регулярного выражения ниже. Пожалуйста, помогите мне понять это.

my $test = "fred andor berry";
if ($test =~ /fred (and|or) berry/) {
    print "Matched!\n";
} else {
      print "Did not match!\n";
}

Я думал, что это будет соответствовать, но я получаю "Не соответствует!" Если я добавлю + в этом, как это,

my $test = "fred andor berry";
if ($test =~ /fred (and|or)+ berry/) {
   print "Matched!\n";
} else {
   print "Did not match!\n";
}

Тогда это совпадает. Я думал, что могу использовать and|or, чтобы сопоставить выражение с «и», «или» и «andor». Нет?

Ответы [ 5 ]

11 голосов
/ 01 сентября 2011

Часть регулярного выражения, (and|or) означает совпадение 'и' или 'или', но не оба.Когда вы добавляете плюс к этой группе, он может совпадать один или несколько раз.Например, "fred andandand berry" также будет правильным совпадением для /fred (and|or)+ berry/

4 голосов
/ 01 сентября 2011

Хотя люди обычно читают a|b как "a или b", | не является оператором ИЛИ; это оператор чередование . Он определяет набор альтернатив для того, что может совпадать в этой точке. Более точное чтение будет «или» или «b» (но не оба) ».

Когда вы пишете (and|or)+, вы добавляете квантификатор +, что означает «один или несколько из предшествующего атома». В результате вместо сопоставления одного значения, которое может быть либо «и», либо «или», оно будет соответствовать серии значений, каждое из которых может быть «или» или «или». Это будет соответствовать всем следующим:

and
or
andor
orand
andorand
andandorororandorandand

Если вы действительно хотите сопоставить только «и», «или», и «andor» (хотя я не знаю, почему вы хотите), вы бы написали это так:

(and|or|andor)    # capture
(?:and|or|andor)  # don't capture

в зависимости от того, хотите ли вы захватить соответствующее значение. (Обычная (...) создает группировку захвата. (?:...) создает группировку без захвата.)

3 голосов
/ 01 сентября 2011

При сопоставлении атома он должен идти сразу после предыдущего атома.

Существует два вида "или".

  • Эксклюзив или
  • включительно или

& # x20;

  • Если | был исключительным или, он совпадал бы, если бы обнаружил либо "или", либо "и" сразу после fred.
  • Если бы | был включающим или, он совпадет, если найдет "или", "и" или оба сразу после fred.

И and, и or невозможно найти сразу после fred, поэтому |, очевидно, является эксклюзивным или.

3 голосов
/ 01 сентября 2011

Выражение (and|or) будет соответствовать and или or, но не andor.Когда вы добавляете +, он будет принимать два (фактически одно или более) последовательных совпадения одного и того же шаблона, что позволяет ему совпадать с andor.(Сначала это соответствует and, затем or.)

1 голос
/ 01 сентября 2011

(и | или) + означает множественные вхождения, но по крайней мере один из них.таким образом, оно также соответствует andand, andorand, orand, ororororand и т. д.

(и | или) означает либо и, либо или.(хороший выбор названия)

Так что это будет соответствовать

Фреду и Берри

и

Фреду или Берри

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

http://perldoc.perl.org/perlre.html

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