如何以任意组合和不同长度匹配字母a,b,c,如下所示:
表达式应符合以下情况:
abc
bc
a
b
bca
但不应与这些匹配:
abz
aab
cc
x
答案 0 :(得分:14)
使用正则表达式
\b(?!(?:.\B)*(.)(?:\B.)*\1)[abc]+\b
您可以将此模式与任何设置和大小一起使用,只需将[abc]
替换为所需的设置...
(以上输出来自myregextester)
答案 1 :(得分:5)
^(?=([^a]*a?[^a]*)$)(?=([^b]*b?[^b]*)$)(?=([^c]*c?[^c]*)$)[abc]{1,3}$
它包含三种变体形式:(?=([^a]*a?[^a]*)$)
它说:从这里(开始)到结束,最多需要一个a
。
^([abc])((?!\1)([abc])((?!\1)(?!\3)[abc])?)?$
答案 2 :(得分:2)
完成整个系列:
^(?:([abc])(?!.*\1))+$
想要处理更多字符?没问题:
^(?:([abcdefgh])(?!.*\1))+$
编辑:显然我误解了这个问题;您没有验证"abc"
和"ba"
等单个字符串,而是尝试在较大的字符串中查找全字匹配。我就是这样做的:
\b(?:([abc])(?![abc]*\1))+\b
棘手的部分是确保前瞻不会超出当前匹配的单词的末尾。例如,如果我将前瞻作为(?!.*\1)
,则它将无法与abc
中的abc za
匹配,因为前瞻会错误地标记a
中的za
}作为a
中abc
的副本。允许前瞻仅查看有效字符([abc]*
)使其保持足够短的牵引力。如果当前单词中存在无效字符,那么无论如何都要发现它们并不是前瞻性的工作。
(感谢Honest Abe让我重新注意这一点。)
答案 3 :(得分:0)
^(?=(.*a.*)?$)(?=(.*b.*)?$)(?=(.*c.*)?$)[abc]{,3}$
锚定前瞻将每个字母的出现次数限制为一个。
答案 4 :(得分:0)
我在评论中将其链接起来(这有点像How can I find repeated characters with a regex in Java?)..但更具体一点..正则表达式:
(\w)\1+
将匹配任何两个或更多相同的角色。否定这一点,你有你的正则表达式。
答案 5 :(得分:0)