我正在尝试使用正则表达式来查找顺序中的字符组合。以下是所有有效选项:
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)
使用以下正则表达式,我可以找到每个字符组合为每个字符中包含的字符组合拉出最长的选项:
(A(?:[C|B|D](?:[C|D](?:[D])?)?))|
(C(?:[D](?:[E])?))|
(B(?:[D](?:[C])?)?)|
(E(?:[D](?:[A|B]))?)
我想 - 使用一个正则表达式 - 仅使用每个序列的最长版本来查找字符串是否具有此列表中的三个或更多实例(即尽管 BD 和 B 都是有效选项,但 BDC 算作一个(。我尝试使用 {3,} 量词,但它会重复计算集合。
不幸的是,系统只会接受正则表达式的真/假结果,我无法用它做更多的事情。我知道这可能是不可能的。
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}