代码之家  ›  专栏  ›  技术社区  ›  webwires

正则表达式“and”

  •  4
  • webwires  · 技术社区  · 15 年前

    我正在从输入中进行一些基本的文本匹配。我需要有能力执行一个基本的“和”。对于“any”,我将输入拆分为空格,并通过管道(“”)字符连接每个单词,但是我没有找到一种方法来告诉正则表达式匹配任何单词。

    switch (searchOption) {
      case "any":
        inputArray = input.split(" ");
        if (inputArray.length > 1) { input = inputArray.join("|"); }
        text = input;
        break;
      case "all":
        inputArray = input.split(" ");
        ***[WHAT TO DO HERE?]***
        text = input;
        break;
      case "exact":
        inputArray = new Array(input);
        text = input;
        break;
    }
    

    看起来应该很容易。

    4 回复  |  直到 13 年前
        1
  •  6
  •   b w    13 年前

    使用 lookahead . 试试这个:

    if( inputArray.length>1 ) rgx = "(?=.*" + inputArray.join( ")(?=.*" ) + ").*";
    

    你最终会得到

    (?=.*dog)(?=.*cat)(?=.*mouse).*
    

    只有当 全部的 这些词出现了,但它们可以是 以任何顺序 .

    • 狗吃了吃老鼠的猫。
    • 老鼠被狗和猫吃了。
    • 大多数猫喜欢老鼠和狗。

    但不是

    • 狗对着老鼠。
    • 猫和狗喜欢老鼠。

    它的工作方式是Regex引擎从当前匹配点(0)扫描以查找 .*dog ,第一个子regex(任意字符的任意数字,后跟 )当它确定该regex的真实性时,它会重置匹配点(回到0),并继续下一个子regex。所以,网络是每个词在哪里并不重要,只是每个词都被找到了。

    编辑:@justin指出我应该有一个尾随 .* ,我已经在上面添加了。没有它, text.match(regex) 作品,但 regex.exec(text) 返回空的匹配字符串。带尾随的 * ,得到匹配的字符串。

        2
  •  3
  •   VoteyDisciple    15 年前

    “和”的问题是:你想用什么组合词?它们可以按任何顺序出现,还是必须按给定的顺序出现?它们能连续出现吗?或者中间能有其他词吗?

    这些决定严重影响您的搜索(或搜索)工作。

    如果您要查找“a b c”(按顺序,连续),则表达式只是 /A B C/ . 完成!

    如果你在找“A FOO B BAR C”,可能是 /A.*?B.*?C/

    如果你在找“b foo a foo c”,你最好做三个单独的测试 /A/ , /B/ /C/

        3
  •  3
  •   Gumbo    15 年前

    做简单的事 for 循环并搜索每个术语,如下所示:

    var n = inputArray.length;
    if (n) {
        for (var i=0; i<n; i++) {
            if (/* inputArray[i] not in text */) {
                break;
            }
        }
        if (i != n) {
            // not all terms were found
        }
    }
    
        4
  •  1
  •   wds    15 年前

    我的正则表达式食谱中有一个正则表达式,它可以使用条件来实现这一点。但是,这很复杂,所以我会选择目前排名最高的答案,它将迭代选项。不管怎样,我认为,要想改变他们的例子,应该是:

    \b(?:(?:(word1)|(word2))(\b.*?)){2,}(?(1)|(?!))(?(2)|(?!))
    

    不保证这会像现在一样有效,但我认为这是基本的想法。明白我对复杂的意思吗?