Java 匹配列表中4个或更多单词的正则表达式 背景
我们有一个系统,它维护正则表达式的存储库,并根据这些正则表达式检查一些传入文本,以达到某些过滤目的。下面描述了我们正在尝试构建的一个正则表达式。由于生产限制,我正在寻找的解决方案是严格基于正则表达式的 问题 我有一个单词列表:单词1,单词2,单词3,单词4,单词5,单词6,单词7,单词8,单词9,单词10。我正在尝试编写一个正则表达式,如果它包含4个或更多这样的单词,那么它将在任意位置以任意顺序匹配字符串 例子Java 匹配列表中4个或更多单词的正则表达式 背景,java,python,regex,Java,Python,Regex,我们有一个系统,它维护正则表达式的存储库,并根据这些正则表达式检查一些传入文本,以达到某些过滤目的。下面描述了我们正在尝试构建的一个正则表达式。由于生产限制,我正在寻找的解决方案是严格基于正则表达式的 问题 我有一个单词列表:单词1,单词2,单词3,单词4,单词5,单词6,单词7,单词8,单词9,单词10。我正在尝试编写一个正则表达式,如果它包含4个或更多这样的单词,那么它将在任意位置以任意顺序匹配字符串 例子 “Abc word3 def word2 ghi word7 jkl word1
- “Abc word3 def word2 ghi word7 jkl word1 mno word5”应该匹配,因为它在给定列表中有4个以上的单词
- “Abc word2 def ghi word8”不应匹配,因为它在给定列表中只有两个单词
((?i)((word1)|(word2)|(word3)|(word4)|(word5)|(word6)|(word7)|(word8)|(word9)|(word10))\b){4,}
有什么建议吗,用Java或Python表示法
编辑:添加了一些背景信息。也许是这样(不是正则表达式,但我认为更可读):
以下正则表达式适用于我的所有测试:
(?i)(.*(^|\b)((word1)|(word2)|(word3)|(word4)|(word5)|(word6)|(word7)|(word8)|(word9)|(word10))($|\b).*){4,}
这些措施包括:
*
来匹配关键字前后的任何字符串
我还仔细检查了它是行的开头还是关键字(测试5)之前的边界字符,我认为它也丢失了。您不需要使用正则表达式。如果您只关心任何单词的出现次数,则可以将输入列表转换为
集合
,并对其执行交叉
操作
wrd_list = ["word1", "word2", "word3", "word4", "word5", "word6", "word7", "word8", "word9", "word10"]
s = "Abc word3 def word2 ghi word7 jkl word1 mno word5"
if len(set(wrd_list).intersection(s.split())) > 4:
print('more than 4 occurrences found')
编辑:这段代码是用Python编写的这看起来像一个。你到底想达到什么目的?@Marat:我们有一个系统,它维护一个正则表达式库,并根据这些正则表达式检查一些传入文本,以达到某些过滤目的。我们正在尝试构建的正则表达式之一就是我所描述的。出于保密原因,我以抽象形式给出了单词表。但是我们有一个具体的单词列表,如果一段文本包含4个或更多单词,我们会“拒绝”它。这个解决方案的复杂性至少是(n选择4),其中n是过滤词的数量。我想这是重新设计系统的一个很好的理由,除了纯正则表达式之外(例如使用python集)@Marat:谢谢你的建议。我们会记住这一点。当评论要求澄清问题时,最好是编辑问题,而不是在评论中详细说明。首先,并非所有读者都阅读所有评论。许多新加入SO的人在编辑中添加了类似“编辑:…”的内容。这是不必要的,也是一种干扰。只要确保你没有真正改变问题,特别是如果一个或多个答案已经发布。顺便说一句,我怀疑正则表达式是否是这项工作的最佳工具,尽管在代码中可能有一个位置。谢谢你的回答。我的用例要求我编写一个正则表达式。我们有一个系统,它接受正则表达式并检查某些传入文本是否与这些正则表达式匹配。就我而言,这是一项艰难的业务要求——我们需要一个正则表达式。谢谢你的回答,但我正在寻找一个正则表达式。这是我们的一个硬业务约束——只有正则表达式的解决方案。这正是我想要的。非常感谢。
wrd_list = ["word1", "word2", "word3", "word4", "word5", "word6", "word7", "word8", "word9", "word10"]
s = "Abc word3 def word2 ghi word7 jkl word1 mno word5"
if len(set(wrd_list).intersection(s.split())) > 4:
print('more than 4 occurrences found')