我做了以下正则表达式:
(\w{2,3})(,\s*\w{2,3})*
这意味着句子应该以 2 或 3 个字母开头,2 或 3 个字母为无限。 现在我应该授权蓝色和黄色这个词。
(\w{2,3}|blue|yellow)(,\s*\w{2,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)
答案 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 个单词字符$
字符串结束