正则表达式在异常内有异常

时间:2021-01-06 12:27:24

标签: regex

我做了以下正则表达式:

(\w{2,3})(,\s*\w{2,3})*

这意味着句子应该以 2 或 3 个字母开头,2 或 3 个字母为无限。 现在我应该授权蓝色和黄色这个词。

(\w{2,3}|blue|yellow)(,\s*\w{2,3})*

只有蓝色和黄色在开头时才有效

有没有办法允许逗号后的异常词而不在代码中重复这个词?

3 个答案:

答案 0 :(得分:2)

我会说使用 answer 给出的 @Toto,但如果您的语言不支持递归模式,您可以尝试:

^(?![, ])(?:,?\s*\b(?:\w{2,3}|blue|yellow))+$

查看在线demo

  • ^ - 起始字符串锚点。
  • (?![, ]) - 否定前瞻以防止以逗号或空格开头。
  • (?: - 打开第一个非捕获组。
    • ,?\b - 匹配一个可选的逗号、零个或多个空格字符和一个单词边界。
    • (?: - 嵌套的第二个非捕获组。
      • \w{2,3}|blue|yellow - 让我们只选择一次。
      • ) - 关闭第二个非捕获组。
    • )+ - 关闭第一个非捕获组并至少匹配一次。
  • $ - 结束字符串锚点。

请注意,\w{2,3} 允许将 ___1_ 之类的内容作为有效输入。

答案 1 :(得分:1)

如果您使用的语言支持递归模式,您可以使用:

^(blue|yellow|\w{2,3})(?:,\s*(?1))*$

Demo & explanation

答案 2 :(得分:1)

如果蓝色或黄色只能出现一次:

^(?:\w{2,3}\s*,\s*)*(?:blue|yellow)(?:\s*,\s*\w{2,3})*$

模式匹配

  • ^ 字符串开头
  • (?:\w{2,3}\s*,\s*)* (可选)重复 2-3 个字符后跟逗号
  • (?:blue|yellow) 匹配蓝色或黄色
  • (?:\s*,\s*\w{2,3})* (可选)匹配逗号和 2-3 个单词字符
  • $ 字符串结束

Regex demo