【问题标题】:Regex AND operator正则表达式 AND 运算符
【发布时间】:2010-06-14 22:13:22
【问题描述】:

基于这个答案

Regular Expressions: Is there an AND operator?

我在http://regexpal.com/ 上尝试了以下操作,但无法正常工作。缺少什么? javascript不支持吗?

正则表达式:(?=foo)(?=baz)

字符串:foo,bar,baz

【问题讨论】:

    标签: regex and-operator


    【解决方案1】:

    (?=foo)(?=baz) 不可能同时匹配。这将要求下一个字符同时是fb,这是不可能的。

    也许你想要这个:

    (?=.*foo)(?=.*baz)
    

    这表示foo 必须出现在任何地方,baz 必须出现在任何地方,不一定按那个顺序并且可能重叠(尽管在这种特定情况下重叠是不可能的,因为字母本身不重叠)。

    【讨论】:

    • 我刚刚在regexpal.com 上尝试过。没有雪茄。也许这是正则表达式的错误?
    • @ghee22:正则表达式工作正常,但使用正则表达式可能不是测试它的最佳方法,因为没有可见的匹配成功或失败的反馈(它是零宽度匹配)。尝试在 Javascript 控制台中运行它,或者将 .* 添加到表达式的末尾。
    • 这绝对适用于 Javascript,但不适用于 regexpal.com
    【解决方案2】:

    我在 javascript 自动完成插件中使用的布尔 (AND) 加通配符搜索示例:

    要匹配的字符串:"my word"

    要搜索的字符串:"I'm searching for my funny words inside this text"

    您需要以下正则表达式:/^(?=.*my)(?=.*word).*$/im

    解释:

    ^ 在行首断言位置

    ?=正向预测

    .* 匹配任何字符(换行符除外)

    ()

    $在行尾断言位置

    i 修饰符:不敏感。不区分大小写的匹配(忽略 [a-zA-Z] 的大小写)

    m 修饰符:多行。使 ^ 和 $ 匹配每行的开始/结束(不仅是字符串的开始/结束)

    在这里测试正则表达式:https://regex101.com/r/iS5jJ3/1

    因此,您可以创建一个 javascript 函数:

    1. 替换正则表达式保留字符以避免错误
    2. 在空格处分割字符串
    3. 将您的单词封装在正则表达式组中
    4. 创建正则表达式模式
    5. 执行正则表达式匹配

    例子:

    function fullTextCompare(myWords, toMatch){
        //Replace regex reserved characters
        myWords=myWords.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
        //Split your string at spaces
        arrWords = myWords.split(" ");
        //Encapsulate your words inside regex groups
        arrWords = arrWords.map(function( n ) {
            return ["(?=.*"+n+")"];
        });
        //Create a regex pattern
        sRegex = new RegExp("^"+arrWords.join("")+".*$","im");
        //Execute the regex match
        return(toMatch.match(sRegex)===null?false:true);
    }
    
    //Using it:
    console.log(
        fullTextCompare("my word","I'm searching for my funny words inside this text")
    );
    
    //Wildcards:
    console.log(
        fullTextCompare("y wo","I'm searching for my funny words inside this text")
    );

    【讨论】:

      【解决方案3】:

      也许您正在寻找类似的东西。如果要选择同时包含“foo”和“baz”的完整行,则此 RegEx 将遵守:

      .*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*

      【讨论】:

        【解决方案4】:

        也许只是一个 OR 运算符 | 就足以解决您的问题:

        字符串:foo,bar,baz

        正则表达式:(foo)|(baz)

        结果:["foo", "baz"]

        【讨论】:

        • 问题是关于AND逻辑的。如果仅存在一个 or 其他词,则具有交替 (|) 的 OR 逻辑也将匹配,这不是意图 - both 必须存在。
        • @mklement0 你说得对。我只提供了一种可能也有用的替代方法。
        猜你喜欢
        • 1970-01-01
        • 2010-10-02
        • 2020-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多