如何在正则表达式中正确使用 'or' 运算符?
How to use 'or' operator in regex properly?
我正在尝试 Javascript 的正则表达式。
我知道 '|
' 用于对两个正则表达式进行 or-ing。
我创建了一个正则表达式 /^a*|b*$/
,我希望它检测任何仅包含 'a' 或 'b'.
字符的字符串
但是当我尝试 /^a*|b*$/.test('c')
时,它会产生 true
?
我缺少对“|
”运算符的理解?
这是我的代码:
let reg = /^a*|b*$/;
< undefined
reg.test('c');
< true
|
的优先级很低。 ^a*|b*$
匹配
- 或者
^a*
- 或
b*$
即以 0 个或多个“a”开头的字符串或以 0 个或多个“b”结尾的字符串。 (因为正则表达式允许匹配 0 'a',所以任何字符串都会匹配(因为每个字符串都有开头)。)
要正确锚定双方的比赛,您需要
/^(?:a*|b*)$/
((?:
)
构造是一个非捕获组)。
您也可以使用
/^a*$|^b*$/
相反。
请注意,这两个正则表达式都只会匹配 aa
、bbbbbb
等字符串,但不会匹配 aba
。如果你想允许在字符串中使用混合 a/b 个字符,你需要像
这样的东西
/^(?:a|b)*$/
您示例中的 OR 将拆分这些备选方案中的表达式:
^a*
和 b*$
.
您可以使用组来分隔备选方案
类似
/^(a*|b*)$/
这将匹配空字符串、仅包含 a
个字符的字符串和仅包含 b
个字符的字符串。
如果您要匹配同时包含 a
和 b
字符的字符串,您可以使用如下内容:
/^[ab]*$/
我正在尝试 Javascript 的正则表达式。
我知道 '|
' 用于对两个正则表达式进行 or-ing。
我创建了一个正则表达式 /^a*|b*$/
,我希望它检测任何仅包含 'a' 或 'b'.
字符的字符串
但是当我尝试 /^a*|b*$/.test('c')
时,它会产生 true
?
我缺少对“|
”运算符的理解?
这是我的代码:
let reg = /^a*|b*$/;
< undefined
reg.test('c');
< true
|
的优先级很低。 ^a*|b*$
匹配
- 或者
^a*
- 或
b*$
即以 0 个或多个“a”开头的字符串或以 0 个或多个“b”结尾的字符串。 (因为正则表达式允许匹配 0 'a',所以任何字符串都会匹配(因为每个字符串都有开头)。)
要正确锚定双方的比赛,您需要
/^(?:a*|b*)$/
((?:
)
构造是一个非捕获组)。
您也可以使用
/^a*$|^b*$/
相反。
请注意,这两个正则表达式都只会匹配 aa
、bbbbbb
等字符串,但不会匹配 aba
。如果你想允许在字符串中使用混合 a/b 个字符,你需要像
/^(?:a|b)*$/
您示例中的 OR 将拆分这些备选方案中的表达式:
^a*
和 b*$
.
您可以使用组来分隔备选方案
类似
/^(a*|b*)$/
这将匹配空字符串、仅包含 a
个字符的字符串和仅包含 b
个字符的字符串。
如果您要匹配同时包含 a
和 b
字符的字符串,您可以使用如下内容:
/^[ab]*$/