regex - 短语重复n次的正则表达式?
问题描述
我让用户输入文本块,我试图阻止他们重复一个短语超过 5 次。所以这很好:
我很喜欢鱼 我很喜欢鱼 我很喜欢鱼
这也可以:
棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。
但这不会是:
我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼 我很喜欢鱼
也不是这个:
棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。棉花糖很好吃。
理想情况下,即使它是这样输入的,它也会捕获它:
我很
喜欢鱼 我很
喜欢鱼 我很喜欢鱼
我很喜欢鱼我很
喜欢鱼 我很
喜欢鱼
我试过了:
\b(\S.*\S)[ ,.]*\b(\1){5}
但它并不总是有效,具体取决于短语的长度,并且似乎只有在每个句子都以句号结尾时才有效。
有任何想法吗?
解决方案
这是一种可能性:
(\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 步)
根据具体情况,它的计算成本可能会很高——使用另一种方法以编程方式查找重复子串可能会更好。
推荐阅读
- flutter - 从颤动的长文本末尾删除矩形框
- sql - 如何编写优先查询,就像我们有 3 个值一样,我们必须显示具有最高优先级的值
- x86 - `_mm_clevict` 内在和相应的 clevict0、clevict1 指令的目的是什么?
- c# - 从asp.net MVC中我的控制器类中的SELECT标记获取值的问题
- php - Wordpress meta_query 如何在 meta_key 上使用“like”比较
- json - 在 ansible playbook 中提取部分 JSON
- flutter - URI 文件中未指定主机:///null
- javascript - If-statment - 从较早的函数()中导入答案
- vue.js - 来自 api 的 Vue 3 data.name 在脚本 setup() 中未定义,但在模板中呈现
- java - 基于列表的计划变量的约束连接