Regular expression pipe confusion

2020-01-28 08:51发布

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.

标签: php regex
5条回答
地球回转人心会变
2楼-- · 2020-01-28 09:24

/^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.

Related discussion

查看更多
爷、活的狠高调
3楼-- · 2020-01-28 09:33

| 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).

查看更多
时光不老,我们不散
4楼-- · 2020-01-28 09:34

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)

查看更多
家丑人穷心不美
5楼-- · 2020-01-28 09:36

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).

查看更多
The star\"
6楼-- · 2020-01-28 09:44

The first means begin by an a or end with a b.

The second means 1 character, an a or a b.

查看更多
登录 后发表回答