Reputation: 821
How come this code returns true?
string to match: ab
pattern: /^a|b$/
but when I put parentheses like this:
pattern: /^(a|b)$/
it will then return false
.
Upvotes: 14
Views: 5072
Reputation: 174299
The first pattern without the parenthesis is equivalent to /(^a)|(b$)/
.
The reason is, that the pipe operator ("alternation operator") has the lowest precedence of all regex operators: http://www.regular-expressions.info/alternation.html (Third paragraph below the first heading)
Upvotes: 23
Reputation: 67382
|
has lower priority than the anchors, so you're saying either ^a
or b$
(which is true) as opposed to the 2nd one which means "a single character string, either a
or b
" (which is false).
Upvotes: 2
Reputation: 16061
In ^a|b$
you are matching for an a
at the beginning or a b
at the end.
In ^(a|b)$
you are matching for an a
or a b
being the only character (at beginning and end).
Upvotes: 2
Reputation: 454960
/^a|b$/
matches a string which begins with an a
OR ends with a b
. So it matches afoo
, barb
, a
, b
.
/^(a|b)$/
: Matches a string which begins and ends with an a
or b
. So it matches either an a
or b
and nothing else.
This happens because alteration |
has very low precedence among regex operators.
Upvotes: 10
Reputation: 52284
The first means begin by an a
or end with a b
.
The second means 1 character, an a
or a b
.
Upvotes: 4