2017-01-13 1 views
0

Die verwirrte mir die letzten 15 Minuten:

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

Ich habe erwartet, dass ‚a‘ oder ‚b‘ nach dem Beginn und am Ende gefolgt, sollte nur ein Zeichen entsprechen. Daher sollte der Test für zwei Zeichen "ab" fehlschlagen. Aber es gelingt. Warum?

Antwort

11

Wenn Sie Gruppe der Wechsel, dann werden Sie das erwartete Verhalten erhalten:

/^(a|b)$/ 

Ihre regex eine a zu Beginn der Zeichenfolge (mit ^a Zweig) oder b am Ende finden wird (mit der b$ Zweig).

Wenn Sie ^(a|b)$ verwenden, werden die Anker auf die gesamte Gruppe angewendet und entsprechen daher einer Zeichenfolge, die a oder b entspricht.

Auch, wenn Sie nicht wirklich brauchen, um den Wert zu erfassen, können Sie entweder ein non-capturing group, /^(?:a|b)$/ oder ein n modifier, /^(a|b)$/n.

3

Ihr regexp abgestimmt ^a oder b$, weil die alternativen Betreiber | niedrigere Priorität als eine Folge von verketteten regexps hat.

In diesem speziellen Fall (eine Alternative einzelner Zeichen) Sie es zu einer Klasse vereinfachen können:

/^[ab]$/ 
+2

Ich glaube 'a' und 'b' hier nur Platzhalter für ein Muster von beliebiger Länge sind, verwendet nur zum Beispiel. –

Verwandte Themen