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,}