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

时间:2017-01-09 11:11:05

标签: regex regex-negation regex-group

我想构建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)

这里有任何暗示吗?非常感谢你!

2 个答案:

答案 0 :(得分:3)

为避免匹配qwuiuQQQQQsas,您需要使用否定前瞻而非非捕获组:

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

请参阅the regex demo

(?!\1)否定前瞻将“限制”.模式仅匹配与第1组匹配的字符以外的字符。

非捕获组不限制任何模式,但仅用于对仍然使用文本的子模式进行分组,并且前瞻(零宽度断言)不使用文本,仅检查符合其模式的文本是否存在于字符串与否。

答案 1 :(得分:2)

我建议使用" \ 1后面没有\ 1"图案:

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

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