13

How can I match letters a,b,c once in any combination and varying length like this:

The expression should match these cases:

abc
bc
a
b
bca

but should not match these ones:

abz
aab
cc
x
4

6 回答 6

18

使用正则表达式模式

\b(?!\w*(\w)\w*\1)[abc]+\b

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


示例

在此处输入图像描述

(以上输出来自myregextester

于 2012-11-24T23:24:44.200 回答
6
^(?=([^a]*a?[^a]*)$)(?=([^b]*b?[^b]*)$)(?=([^c]*c?[^c]*)$)[abc]{1,3}$

适用前瞻

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

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

结合前瞻反向引用

^([abc])((?!\1)([abc])((?!\1)(?!\3)[abc])?)?$
于 2012-11-24T22:44:58.957 回答
3

只是为了完善该系列:

^(?:([abc])(?!.*\1))+$

想要处理更大的字符集?没问题:

^(?:([abcdefgh])(?!.*\1))+$

编辑:显然我误读了这个问题;您不是在验证单个字符串,例如"abc"and "ba",而是在尝试在更大的字符串中查找全字匹配。我会这样做:

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

棘手的部分是确保前瞻不会超出当前匹配的单词的末尾。例如,如果我将前瞻保留为(?!.*\1),它将无法匹配abcin ,因为前瞻会错误地将inabc za标记为ainza的副本。允许先行只查看有效字符 ( ) 使其保持足够短的约束。而且,如果当前单词中有无效字符,无论如何都不是先行的工作来发现它们。aabc[abc]*

(感谢Honest Abe让我重新注意到这一点。)

于 2012-11-25T00:57:25.783 回答
1
^(?=(.*a.*)?$)(?=(.*b.*)?$)(?=(.*c.*)?$)[abc]{,3}$

锚定前瞻将每个字母的出现次数限制为一个。

于 2012-11-24T22:24:29.397 回答
1

试试这个正则表达式:

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

检查正则表达式

于 2012-11-24T22:46:53.383 回答
0

我在评论中链接了它(这有点像How can I find repeat characters with a regex in Java?)..但更具体地说..正则表达式:

(\w)\1+

将匹配任何两个或多个相同的字符。否定它,你就有了你的正则表达式。

于 2012-11-24T22:29:51.060 回答