如何排除第一组的单个字符从匹配到第二组?

问题描述:

我想建立q正则表达式,匹配重复的单个字符的模式,然后相互跟随。 例如三次相同的字符'A',然后是两次另一个字符'B'。第二组的角色重复两次以上并不重要。 比如,它应该匹配字符串wuzDDDFFFxji如何排除第一组的单个字符从匹配到第二组?

Full match 3-8 `DDDFF` 
Group 1. 3-4 `D` 
Group 2. 6-7 `F` 

我已经想出以下正则表达式,但有一个限制。

(.)\1{2}(.)\2{1} 

它几乎可以工作,但它不会排除在第二组中匹配的第一组人物。字符串qwuiuQQQQQsas将被匹配,因为:

Full match 5-10 `QQQQQ` 
Group 1. 5-6 `Q` 
Group 2. 8-9 `Q` 

这不符合我想要什么,但我找不到正确的语法从另一个被匹配排除特定的群体。我最近的尝试似乎没有工作

(.)\1{2}((?:\1))\2{1} 


1st Capturing Group (.) 
. matches any character (except for line terminators) 
\1{2} matches the same text as most recently matched by the 1st capturing group 
{2} Quantifier — Matches exactly 2 times 
2nd Capturing Group ((?:\1)) 
Non-capturing group (?:\1) 
\1 matches the same text as most recently matched by the 1st capturing group 
\2{1} matches the same text as most recently matched by the 2nd capturing group 
{1} Quantifier — Matches exactly one time (meaningless quantifier) 

这里的任何提示?非常感谢!

+0

什么是正则表达式的味道/编程语言/工具?为什么最后的模式没有工作? –

+0

如果您想避免与'qwuiuQQQQQsas'中的任何内容匹配,请尝试['(。)\ 1 {2}((?!\ 1)。)\ 2'](https://regex101.com/r/rjRNik/1) ' –

为了避免匹配qwuiuQQQQQsas你需要使用负先行,而不是一个非捕获组:

(.)\1{2}((?!\1).)\2 
     ^^^^^^ 

the regex demo

(?!\1)负先行将“限制”的.图案匹配成组比其它只匹配字符1.

非捕获基团不限制任何图案,而是用于只是组子模式仍然使用文本和预览(零宽度断言)不消耗文本,只检查在字符串中是否存在满足该模式的文本。

+0

似乎工作!我没有这么远。顺便说一句,有什么令我感到困惑的。顺便说一下,因为我想要n次相同的字符,为什么我必须在引用该组之后写{n-1}?它似乎已经被捕获了一次。 – tbop

+1

你匹配一个字符'',它是在捕获圆括号'()'里面。因此,在添加'\ 1 {2}'后,它将捕获2个更多相同的字符,总共3个。组使用文本,只能查找(lookbehead,lookaheads)和其他零宽度断言(字边界,锚点)不会消耗文本。 –

我会建议使用 “\ 1后面没有\ 1” 模式:

(.)\1+(?!\1)(.)\2+ 

演示:https://regex101.com/r/QkqpzS/1