正则表达式量词(无重复)

时间:2017-04-04 18:19:10

标签: regex

我正在尝试使用正则表达式来按顺序查找字符组合。以下是所有有效选项:

ABCD
AD
ACD
BDC
BD
B
CD
CDE
EDA
EDB
E

这些字符将在整个较大的字符串中逐字排列,无论是按顺序还是其他方式,例如

"Here is a string that will ABCD have some in it" -- ABCD (1 occurrence)
"Another string with EDAEDBCD some in it" -- EDA, EDB, CD (3 occurrences)
"Here ACD is a E string with ACD a bunch AD" -- ACD, E, ACD, AD (4 occurrences)
"And another ABCDE" -- ABCD, E (2 occurrences)

使用以下RegEx我可以找到每个字符组合为每个包含另一个字符的字符组合提取最长的选项:

(A(?:[C|B|D](?:[C|D](?:[D])?)?))|
(C(?:[D](?:[E])?))|
(B(?:[D](?:[C])?)?)|
(E(?:[D](?:[A|B]))?)

我希望 - 使用一个正则表达式 - 只使用每个序列的最长版本来查找该字符串中是否有来自此列表的三个或更多实例(即BDC计为一个,尽管BD和B都是有效选项) 。我已经尝试使用{3,}量词,但它会对集合进行双重计算。

不幸的是,系统只会获取正则表达式的真/假结果,而我无法再使用它。我明白这可能是不可能的。

1 个答案:

答案 0 :(得分:1)

Perl或C ++,几乎不同的光谱端。你至少需要
原子组以保持最长的子串。

如果您使用的引擎没有原子组,那么它就不会这样做。

(?m)^(?>.*?(?:ABCD|AD|ACD|BDC|BD|B|CDE|CD|EDA|EDB|E)){3}

扩展

 (?m)          # Multi-line mode
 ^             # Beginning of line
 (?>           # Atomic group, get one of these exactly 3 times
      .*?   
      (?:
           ABCD
        |  AD
        |  ACD
        |  BDC
        |  BD
        |  B
        |  CDE
        |  CD
        |  EDA
        |  EDB
        |  E
      )
 ){3}