如何在正则表达式中正确使用 '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*$/

相反。

请注意,这两个正则表达式都只会匹配 aabbbbbb 等字符串,但不会匹配 aba。如果你想允许在字符串中使用混合 a/b 个字符,你需要像

这样的东西
/^(?:a|b)*$/

您示例中的 OR 将拆分这些备选方案中的表达式: ^a*b*$.

您可以使用组来分隔备选方案

类似

/^(a*|b*)$/

这将匹配空字符串、仅包含 a 个字符的字符串和仅包含 b 个字符的字符串。

如果您要匹配同时包含 ab 字符的字符串,您可以使用如下内容:

/^[ab]*$/