恰好匹配相同字符的N次重复

geo*_*org 8 .net python java regex perl

如何编写一个完全匹配相同字符(或理想情况下,同一组)的N次重复的表达式?基本上,(.)\1{N-1}做,但有一个重要的限制:表达式应该如果这个问题重复失败了N倍.例如,给定N=4和字符串xxaaaayyybbbbbzzccccxx,表达式应该匹配aaaaccccbbbb.

我没有专注于任何特定的方言,随意使用任何语言.请不要发布仅适用于此特定示例的代码,我正在寻找一般解决方案.

Dev*_*rre 12

使用负向前瞻负面后瞻.

这将是正则表达式:(.)(?<!\1.)\1{N-1}(?!\1)除了Python的re模块被破坏(参见此链接).

英语翻译:"匹配任何一个字符.确保在匹配该字符后,前面的字符也不是那个字符.匹配N-1个字符的重复次数.确保重复之后的字符不是那个字符."

不幸的是,re模块(和大多数正则表达式引擎)都被破坏了,因为你不能在lookbehind断言中使用反向引用.Lookbehind断言需要是恒定长度,并且编译器不够聪明,无法推断它是在使用反向引用时(即使在这种情况下,backref具有恒定长度).我们必须通过这个来处理正则表达式编译器,如下所示:

实际的答案将不得不梅西耶:r"(.)(?<!(?=\1)..)\1{N-1}(?!\1)"

这可以解决re模块中的错误,(?=\1)..而不是\1.(这些在大多数情况下是等效的.)这使得正则表达式引擎可以准确地知道lookbehind断言的宽度,因此它可以在PCRE和re等中工作.


当然,现实世界的解决方案就像 [x.group() for x in re.finditer(r"(.)\1*", "xxaaaayyybbbbbzzccccxx") if len(x.group()) == 4]


Lou*_*man 6

我怀疑你想要使用否定前瞻: (.)\1{N-1}(?!\1).

但那说......我怀疑最简单的跨语言解决方案就是在不使用正则表达式的情况下自己编写.

更新:

^(.)\\1{3}(?!\\1)|(.)(?<!(?=\\2)..)\\2{3}(?!\\2) 对我来说更为普遍,包括从字符串开头开始的匹配.

  • 我认为它匹配,因为它仍然捕获了最后4个b ...与Joe发布的答案相同 (3认同)