条件正则表达式搜索

时间:2011-08-21 20:39:58

标签: java regex expression

我正在尝试用Java创建一个带有条件搜索词的正则表达式代码。

我的意思是让我说我​​有5个字;树,车,狗,猫,鸟。现在我希望表达式搜索这些术语,但是只需要匹配五个中的3个,它可以是它选择匹配的5个中的任何一个。

我想也许是使用后退引用?(3)可以工作,但似乎没有做到这一点。

标准可选搜索(?)不起作用,因为所有术语都是可选的,但是所需的匹配数不是。基本上有一种方法可以创建一个必须是50%(或任何百分比)正确的字符串来提供匹配吗?

有人会碰巧知道或者能指出我正确的方向吗?

(如果可能的话,我希望它能在客户端工作)

3 个答案:

答案 0 :(得分:2)

它是否必须是一个独立的正则表达式而没有任何进一步的代码?对每个单词进行简单的循环测试并计算匹配应该完美地完成。伪代码假设您需要N个唯一匹配(您也可以将子字符串测试与正则表达式交换,只要您保持对正则表达式中唯一匹配的计数,无论您如何确定匹配):

bool has_N_words(int n, string[] words, string text) {
    int matches = 0;
    foreach word in words {
        if (word.substringOf(text)) counter++
        if (counter >= n) return true
    }
    return false
}

在我看来,这是唯一的(除了令人费解的正则表达式扩展 - 不是我有一些想法,我只是一次又一次地惊讶现代正则表达式实现允许)通过常规方式做到这一点表达式是这样的:

  1. 列举所有唯一(忽略顺序或不依赖于实施,见下文)单词排列
  2. 对于每个排列,构建一个子正则表达式,该子正则表达式匹配包含这些单词的字符串
    1. 将前三个单词与.*?联系起来(这需要所有独特的排列)
    2. 使用三个前瞻断言,例如(?=.*word)(这允许丢弃之前以不同顺序发生的单词组合)
  3. 将所有子正则表达式组合在一个巨人或。
  4. 手动,丑陋和复杂(如在计算复杂性方面,而不是在编程工作中)自动执行,低效率以及任何方式相当hacky都是不切实际的。

答案 1 :(得分:0)

我不明白你为什么要用正则表达式来做这个,但如果你真的需要它是一个正则表达式:

/(树|汽车|狗|猫|鸟)/

然后计算你从那里得到的比赛......

答案 2 :(得分:0)

(?i)(?s)(.*(tree|car|dog|cat|bird)){3,}?.*

(?i)用于不区分大小写,(?s)用于匹配新行。*,因为您正在查看电子邮件。
的?最后是不情愿的量词。

我还没有尝试过。