如何使用正则表达式匹配任何字母组合?

时间:2012-11-24 22:16:59

标签: javascript java html regex perl

如何以任意组合和不同长度匹配字母a,b,c,如下所示:

表达式应符合以下情况:

abc
bc
a
b
bca

但不应与这些匹配:

abz
aab
cc
x

6 个答案:

答案 0 :(得分:14)

使用正则表达式

\b(?!(?:.\B)*(.)(?:\B.)*\1)[abc]+\b

您可以将此模式与任何设置和大小一起使用,只需将[abc]替换为所需的设置...

即可

Example

enter image description here

(以上输出来自myregextester

答案 1 :(得分:5)

^(?=([^a]*a?[^a]*)$)(?=([^b]*b?[^b]*)$)(?=([^c]*c?[^c]*)$)[abc]{1,3}$

workslookaheads

它包含三种变体形式:(?=([^a]*a?[^a]*)$)

它说:从这里(开始)到结束,最多需要一个a

合并lookaheadsbackreferences

^([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 }作为aabc的副本。允许前瞻仅查看有效字符([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)

试试这个正则表达式:

^([abc])((?!\1)([abc]))?((?!(\1|\2))([abc]))?$

签入regexpal