我正在尝试 Javascript 的正则表达式。
我知道 ' |
' 用于对两个正则表达式进行 or-ing。
我创建了一个正则表达式/^a*|b*$/
,我希望它检测任何只包含“a”或“b”字符的字符串。
但是当我尝试时/^a*|b*$/.test('c')
,它会产生true
?
我缺少对“ |
”运算符的理解?
这是我的代码:
let reg = /^a*|b*$/;
< undefined
reg.test('c');
< true
我正在尝试 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]*$/