编写正则表达式匹配不重复指定单词的完整空格分隔字符串
解决指定单词的唯一出现匹配正则表达式问题
需求回顾
- 输入字符串只能包含以下5个单词:foo、bar、foobar、footable、somebar
- 单词之间必须用空格分隔
- 每个单词仅能出现一次
- 必须匹配整个字符串,不符合条件则直接匹配失败
原有正则的不足
你提供的正则(\b(foo|bar|foobar|footable|somebar)\b\ *){1,5}只能满足前两项要求,无法限制单词重复出现,也没有锚定整个字符串,会出现部分匹配的无效情况。
最终解决方案正则
^(?!.*\b(foo|bar|foobar|footable|somebar)\b.*\b\1\b)(?:\b(foo|bar|foobar|footable|somebar)\b\ *){1,5}$
正则拆解说明
^和$:分别锚定字符串的开头和结尾,确保正则匹配的是整个字符串,杜绝部分匹配的问题(?!.*\b(foo|bar|foobar|footable|somebar)\b.*\b\1\b):正向否定预查逻辑,用来禁止单词重复。它会扫描整个字符串,一旦发现任意指定单词出现两次,直接判定匹配失败。其中\1是引用前面捕获到的单词,用来对比是否重复(?:\b(foo|bar|foobar|footable|somebar)\b\ *){1,5}:匹配1到5个指定单词,每个单词后跟任意数量的空格(兼容可能的末尾空格),\b确保匹配的是完整单词,避免出现类似foobar被误拆成foo+bar的错误匹配
如果需要严格限制单词间只能有单个空格,且字符串结尾不能有空格,可以使用下面的正则:
^(?!.*\b(foo|bar|foobar|footable|somebar)\b.*\b\1\b)(?:\b(foo|bar|foobar|footable|somebar)\b(?: |$)){1,5}$
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

