2017-01-13 3 views
0

Это озадачило меня последние 15 минут:

if ('ab' =~ /^a|b$/) { print 't' } else { print 'f' } 
print "\n"; 

Я ожидал, что «а» или «б» после начала и затем в конце, должен соответствовать только один символ. Таким образом, тест должен завершиться неудачей для двух символов «ab». Но это удается. Зачем?

ответ

11

Если группа чередование, то вы получите ожидаемое поведение:

/^(a|b)$/ 

Вашего регулярное выражение будет найти a в начале строки (с ^a филиалом) или b в конце (с b$ филиал).

При использовании ^(a|b)$ анкеры применяются ко всей группе и, таким образом, будут соответствовать строке, равной a или b.

Кроме того, если вы на самом деле не нужно, чтобы захватить значение, вы можете либо использовать non-capturing group, /^(?:a|b)$/, или n modifier, /^(a|b)$/n.

3

Ваше регулярное выражение соответствует ^a или b$, поскольку альтернативный оператор | имеет более низкий приоритет, чем последовательность конкатенированных регулярных выражений.

В данном конкретном случае (альтернативный вариант отдельных символов), вы можете упростить его к классу:

/^[ab]$/ 
+2

Я считаю, что '' Ā' и b' просто заполнители для шаблона любой длины здесь, используется только, например. –