正则表达式重复n次?

时间:2018-11-13 05:11:34

标签: regex

我让用户输入文本块,并且试图阻止他们重复一个短语超过5次。 这样就可以了:

  

我非常喜欢鱼,我非常喜欢鱼,我非常喜欢鱼

这样:

  

棉花糖很好吃。棉花糖很好吃。棉花糖是   好吃。

但这不是:

  

我非常喜欢鱼,我非常喜欢鱼,我非常喜欢鱼,我   我非常喜欢鱼我非常喜欢鱼我非常喜欢鱼   我非常喜欢鱼

也不是:

  

棉花糖很好吃。棉花糖很好吃。棉花糖是   好吃。棉花糖很好吃。棉花糖很好吃。棉花糖   很好吃棉花糖很好吃。棉花糖很好吃。   棉花糖很好吃。棉花糖很好吃。

理想情况下,即使这样输入,它也会捕获它:

  

我非常喜欢鱼
  我非常喜欢鱼
  我非常喜欢鱼
  我非常喜欢鱼
  我非常喜欢鱼
  我非常喜欢鱼

我尝试过:

\b(\S.*\S)[ ,.]*\b(\1){5}

但这并不总是有效的,取决于词组的长度,并且似乎只有在每个句子都以句号结尾时才起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是一种可能性:

(\b\w.{3,49})\1{4}

它捕获一个组中2到50个字符(以单词字符开头),并检查该组是否连续重复了至少5次。

https://regex101.com/r/tS6kHF/2

如果正则表达式通过,则会出现一些重复的短语。

也就是说,这可能不是一个好主意,尤其是对于大型输入字符串-如您在链接上可以看到的,这需要大量步骤,因为对于输入中的每个字符(例如,以“ hello”),它必须找到相应的长度为2的子字符串(“ he”),并检查其是否重复,然后找到“ hel”及其后的内容,然后找到“ hell”及其后的内容,依此类推,共50次。然后,它从下一个字符“ e”:“ el”开始,然后是“ ell”,然后是“ ello”,依此类推。(您 do 需要一个上限,例如50个字符或类似的字符-否则,计算时间会增加,例如从8k步提高到74k步)

视情况而定,计算上可能会很昂贵-使用另一种方法programatically find重复子字符串可能会更好。