首页 > 解决方案 > 短语重复n次的正则表达式?

问题描述

我让用户输入文本块,我试图阻止他们重复一个短语超过 5 次。所以这很好:

我很喜欢鱼 我很喜欢鱼 我很喜欢鱼

这也可以:

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

但这不会是:

我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼

也不是这个:

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

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

我很
喜欢鱼 我很
喜欢鱼 我很喜欢鱼
我很喜欢鱼我很
喜欢鱼 我很
喜欢鱼

我试过了:

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

但它并不总是有效,具体取决于短语的长度,并且似乎只有在每个句子都以句号结尾时才有效。

有任何想法吗?

标签: regex

解决方案


这是一种可能性:

(\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”,等等。(你确实需要一个上限,比如 50 个字符,或者其他什么 - 否则,计算时间向上,例如 8k 步到 74k 步)

根据具体情况,它的计算成本可能会很高——使用另一种方法以编程方式查找重复子串可能会更好。


推荐阅读