Regex 正则表达式以匹配包含任意顺序的两个名称的字符串

Regex 正则表达式以匹配包含任意顺序的两个名称的字符串,regex,string,Regex,String,我需要正则表达式中的逻辑和 差不多 杰克和詹姆斯 同意下列条件 “嗨,杰克这是詹姆斯” “嗨,詹姆斯这里是杰克” 试试: james.*jack 如果您想同时使用这两个选项,则或它们: james.*jack|jack.*james 你可以做: \bjack\b.*\bjames\b|\bjames\b.*\bjack\b 您可以使用正面外观头进行检查。以下是以下内容的摘要: 向前看和向后看,统称为“环顾”,是 长度为零的断言…lookaround实际上匹配字符,但是 然后放弃匹配,只返

我需要正则表达式中的逻辑和

差不多

杰克和詹姆斯

同意下列条件

  • “嗨,杰克这是詹姆斯

  • “嗨,詹姆斯这里是杰克

试试:

james.*jack
如果您想同时使用这两个选项,则
它们:

james.*jack|jack.*james
你可以做:

\bjack\b.*\bjames\b|\bjames\b.*\bjack\b

您可以使用正面外观头进行检查。以下是以下内容的摘要:

向前看和向后看,统称为“环顾”,是 长度为零的断言…lookaround实际上匹配字符,但是 然后放弃匹配,只返回结果:匹配或不匹配。 这就是为什么它们被称为“断言”。他们不消费 字符串中的字符,但仅断言是否可能匹配 或者不是

然后,它继续解释,正lookaheads用于断言后面的内容与某个表达式匹配,而不占用该匹配表达式中的字符

因此,下面是一个表达式,它使用两个后续的正向lookahead来断言短语以任意顺序匹配
jack
james

^(?=.*\bjack\b)(?=.*\bjames\b).*$

括号中以
?=
开头的表达式是正的lookaheads。我将分解模式:

  • ^
    断言要匹配的表达式的开头
  • (?=.*\bjack\b)
    是第一个积极的前瞻性语句,表示后面的内容必须匹配
    *\bjack\b
  • *
    表示任何字符零次或多次
  • \b
    表示任何单词边界(空白、表达式开头、表达式结尾等)
  • jack
    就是一行中的四个字符。(下一个正向前瞻中的
    james
    也是如此。)
  • $
    将表达式的结尾断言为匹配
  • 因此,第一个向前看表示“后面的内容(本身不是向前看或向后看)必须是一个表达式,该表达式必须以零个或多个字符开头,后跟一个单词边界,然后是
    jack
    和另一个单词边界”,第二个向前看表示“后面的表达式必须以零个或多个字符开头,后跟一个单词边界,然后是
    james
    和另一个单词边界。”两个lookahead之后是
    *
    ,它只匹配任何字符零次或多次,而
    $
    则匹配表达式的结尾

    “从任何东西开始,然后是杰克或詹姆斯,然后以任何东西结束”满足第一个前瞻性,因为有许多字符,然后是单词
    jack
    ,满足第二个前瞻性,因为有许多字符(这恰好包括
    jack
    ,但这不是满足第二个lookahead的必要条件)然后是单词
    james
    。两个lookahead都不能断言表达式的结尾,因此后面的
    *
    可以超出满足lookahead的范围,例如“then end with anything”

    我想你明白了,但要说清楚,
    jack
    james
    的意思是相反的,即“从任何事情开始,然后是james或jack,然后以任何事情结束。”“它满足第一个前瞻性,因为有许多字符,然后是单词
    james
    ,它满足第二个前瞻性,因为有许多字符(恰好包括
    james
    ,但这不是满足第二个前瞻性所必需的)然后,单词
    jack
    。与前面一样,任何一个lookahead都不能断言表达式的结尾,因此后面的
    *
    可以超出满足lookahead的范围,例如“然后以任何内容结尾”

    这种方法的优点是可以轻松指定多个条件

    ^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
    

    我将要编写的命令说明:-

    表示任何字符、数字都可以代替

    *
    表示之前写入的内容的出现次数为零或更多

    |
    表示“或”

    所以

    将搜索
    james
    ,然后搜索任意数量的字符,直到
    jack
    出现

    因为你想要
    jack.*james
    或者
    james.*jack

    因此,命令

    jack.*james|james.*jack
    
    它又短又甜

    (?=.*jack)(?=.*james)
    

    测试用例:
    [
    “xxx詹姆斯xxx杰克xxx”,
    “杰克·詹姆斯”,
    “杰克xxx果酱”,
    “杰姆和杰克”,
    “杰克”,
    “詹姆斯”,
    ]
    
    .forEach(s=>console.log(/(?=.*james)(?=.*jack)/.test(s))
    Vim有一个分支操作符
    \&
    ,在以任何顺序搜索包含一组单词的行时都很有用。此外,扩展所需单词集很简单

    比如说,

    /.*jack\&.*james

    将以任意顺序匹配包含
    jack
    james
    的行

    有关用法的更多信息,请参阅。我不知道还有任何其他实现分支的正则表达式风格;wikipedia条目中甚至没有记录运算符。

    任何顺序对一个
    jack
    和一个
    james
    执行此操作

    在这里,我们将探索其他场景

    方法1:一个
    jack
    和一个
    james
    以防万一,两个
    jack
    或两个
    james
    是不允许的,只有一个
    jack
    和一个
    james
    是有效的,我们可以设计一个类似于以下的表达式:

    ^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
    
    在这里,我们将使用以下语句排除这些实例:

    (?!.*\bjack\b.*\bjack\b)
    
    以及

    我们还可以将其简化为:

    ^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
    

    如果希望简化/更新/浏览表达式,已在的右上面板中进行了说明。如果您感兴趣,可以查看匹配的步骤或在中进行修改。调试器演示了如何逐步使用一些示例输入
    (?!.*\bjames\b.*\bjames\b)
    
    ^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
    
    (\bjames\b){1,}.*(\bjack\b){1,}|(\bjack\b){1,}.*(\bjames\b){1,}