regex - 匹配所有出现 n 次的元素

标签 regex

我想选择精确出现 n 次的相同元素。

匹配此字符串中精确重复 3 次的字母:"aaaaabbbcccccccccdddee"

这应该返回 "bbb""ddd"

如果我定义我应该匹配的内容,如“b{3}”或“d{3}”,这会更容易,但我想匹配所有元素

我试过了,最接近的是这个正则表达式:(.)\1{2}(?!\1) 返回 "aaa""bbb""ccc""ddd"

由于“非固定宽度”(?<!\1)

,我不能在后面添加负面的lookbehind

最佳答案

一种可能性是使用一个正则表达式来查找一个不跟随其自身(或行首)的字符,然后是三个相同的字符,然后是另一个与后三个不同的字符,即

(?:(.)(?!\1)|^)((.)\3{2})(?!\3)

Demo on regex101

匹配在第 2 组中被捕获。但问题是它在匹配之前吸收了一个字符,因此找不到相邻的匹配:如演示中所示,它只匹配 aaa , ccceeeaaabbbcccdddeee.

这个问题可以通过将整个正则表达式设为前瞻来解决,该技术允许捕获重叠匹配,如 this question 中所述.所以:

(?=(?:(.)(?!\1)|^)((.)\3{2})(?!\3))

同样,比赛在第 2 组中被捕获。

Demo on regex101

关于regex - 匹配所有出现 n 次的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71656063/

相关文章:

python - 如何匹配一行中第一个字符之后的字符串

javascript - 自定义正则表达式来格式化数字

java - matches() 匹配Java中必须以大写字母开头的单词

JavaScript split() 使用一个共同的字符,然后 join() 使用不同的字符

Java - 在正则表达式中转义元字符 [ 和 ]

regex - Nginx 多个 "Single Page App"路由

javascript - 捕获正则表达式灾难性回溯 Node.js

php - 去掉括号外的文字

java - 当特定字符串包含在其中时,正则表达式提取连续的单行注释

JavaScript(正则表达式): excluding matches from output