Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匹配列表中4个或更多单词的正则表达式 背景_Java_Python_Regex - Fatal编程技术网

Java 匹配列表中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

我们有一个系统,它维护正则表达式的存储库,并根据这些正则表达式检查一些传入文本,以达到某些过滤目的。下面描述了我们正在尝试构建的一个正则表达式。由于生产限制,我正在寻找的解决方案是严格基于正则表达式的

问题 我有一个单词列表:单词1,单词2,单词3,单词4,单词5,单词6,单词7,单词8,单词9,单词10。我正在尝试编写一个正则表达式,如果它包含4个或更多这样的单词,那么它将在任意位置以任意顺序匹配字符串

例子
  • “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,}
这些措施包括:

  • “Abc word3 def word2 ghi word7 jkl word1 mno word5”->正确
  • “Abc word2 def ghi word8”->错误
  • “word3 sadasd sadasd word1 word2 word4”->正确
  • “word3 sadasd sadasd word1 Word2 Word4”->false
  • “aword3 sadasd sadasd WORD 1 WORD 2 WORD 4”->错误
  • “word3 sadasd sadasd word1 word2 word4a”->false
  • 我认为您原来的正则表达式主要缺少
    *
    来匹配关键字前后的任何字符串


    我还仔细检查了它是行的开头还是关键字(测试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')