我让用户输入文本块,并且试图阻止他们重复一个短语超过5次。 这样就可以了:
我非常喜欢鱼,我非常喜欢鱼,我非常喜欢鱼
这样:
棉花糖很好吃。棉花糖很好吃。棉花糖是 好吃。
但这不是:
我非常喜欢鱼,我非常喜欢鱼,我非常喜欢鱼,我 我非常喜欢鱼我非常喜欢鱼我非常喜欢鱼 我非常喜欢鱼
也不是:
棉花糖很好吃。棉花糖很好吃。棉花糖是 好吃。棉花糖很好吃。棉花糖很好吃。棉花糖 很好吃棉花糖很好吃。棉花糖很好吃。 棉花糖很好吃。棉花糖很好吃。
理想情况下,即使这样输入,它也会捕获它:
我非常喜欢鱼
我非常喜欢鱼
我非常喜欢鱼
我非常喜欢鱼
我非常喜欢鱼
我非常喜欢鱼
我尝试过:
\b(\S.*\S)[ ,.]*\b(\1){5}
但这并不总是有效的,取决于词组的长度,并且似乎只有在每个句子都以句号结尾时才起作用。
有什么想法吗?
答案 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重复子字符串可能会更好。