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

Mel*_*oun 149 regex string

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

就像是

杰克和詹姆斯

同意以下字符串

  • '你好杰克在这里是詹姆斯 '

  • "你好詹姆斯在这里是杰克 "

Ali*_*aru 227

您可以使用lookarounds进行检查:

^(?=.*\bjack\b)(?=.*\bjames\b).*$
Run Code Online (Sandbox Code Playgroud)

测试一下.

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

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
Run Code Online (Sandbox Code Playgroud)

  • 有人会更详细地解释这个例子是如何工作的吗? (10认同)
  • `\b` 在这里是什么意思? (3认同)
  • `vim` 语法:`^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$` 或 `\v^(.*<jack> )@=(.*<james>)@=.*$` (2认同)

icy*_*com 87

尝试:

james.*jack
Run Code Online (Sandbox Code Playgroud)

如果你想要两个同时,那么or他们:

james.*jack|jack.*james
Run Code Online (Sandbox Code Playgroud)

  • 我建议让它变得懒惰“james.*?jack|jack.*?james”。这将对大文本有所帮助。 (3认同)
  • 请注意,这也将匹配“jacky”和“jameson”等名称 (3认同)
  • 这个对我有用,比公认的答案更简洁、更容易理解! (2认同)
  • 我需要一个只有两个名称匹配的解决方案,所以这个答案对于这种情况更简洁。但是接受的答案在 2 之后变得更加简洁,因为“或”的数量成倍增加。对于 3 个名称,将有 6 个“或”,4 个名称将是 24 个“或”,以此类推。 (2认同)

Shu*_*rma 38

我要写的命令的解释: -

. 意味着任何字符,数字都可以代替.

* 意味着在它之前写入的事物出现零次或多次.

|意思是'或'.

所以,

james.*jack
Run Code Online (Sandbox Code Playgroud)

会搜索james ,然后搜索任意数量的角色jack.

既然你想要jack.*james或者james.*jack

因此命令:

jack.*james|james.*jack
Run Code Online (Sandbox Code Playgroud)

  • 作为旁注 - 您也可以编辑@ icyrock的答案(与您的答案相同,仅在6年前),您的解释本身非常有用. (4认同)
  • 谢谢你的回答,但是我觉得有必要指出在VSCode搜索中,你的答案是**jack.*james | 詹姆斯.*杰克**将采取'|'之间的空格 (或)在搜索过程中考虑的符号.**杰克.*詹姆斯|詹姆斯.*杰克**工作,并没有寻找空间 (2认同)
  • IF $ _explanation ==="awesome"那么返回$ THUMBS_UP ENDIF; (2认同)

Emm*_*mma 7

此答案中的表达式以任何顺序执行 1jack和 1 。james

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

方法一:一jack加一james

为了以防万一,不允许有两个jack或两个,只有一个和一个有效,我们可以设计一个类似于以下的表达式:jamesjackjames

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Run Code Online (Sandbox Code Playgroud)

在这里,我们将使用这些语句排除这些实例:

(?!.*\bjack\b.*\bjack\b)
Run Code Online (Sandbox Code Playgroud)

和,

(?!.*\bjames\b.*\bjames\b)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示 1

我们还可以将其简化为:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示 2


如果您希望简化/更新/探索表达式,请在regex101.com的右上角面板上进行解释。如果您有兴趣,可以在此调试器链接中观看匹配步骤或修改它们。调试器演示了RegEx 引擎如何逐步使用一些示例输入字符串并执行匹配过程。


正则表达式电路

jex.im可视化正则表达式:

在此输入图像描述

测试

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Run Code Online (Sandbox Code Playgroud)


方法 2:按特定顺序排列一jack和一james

该表达式也可以设计为先 ajames然后 a jack,类似于以下:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示 3

反之亦然:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示 4


bob*_*ble 7

不需要两次lookaheads,一个子串就可以正常匹配

^(?=.*?\bjack\b).*?\bjames\b.*
Run Code Online (Sandbox Code Playgroud)

请参阅 regex101 上的演示

环视是零长度断言(条件)。这里的前瞻在^ 开始时jack检查字符串中是否稍后出现,并在成功时检查其余james部分.*(可以删除)。 用在单词之前(包含在\b 单词边界中)。使用i- 标志忽略大小写


cod*_*ict 5

你可以做:

\bjack\b.*\bjames\b|\bjames\b.*\bjack\b
Run Code Online (Sandbox Code Playgroud)


小智 5

它简短而甜美

(?=.*jack)(?=.*james)
Run Code Online (Sandbox Code Playgroud)


Fir*_*ock 5

Vim 有一个分支运算符\&,在搜索包含任意顺序的一组单词的行时非常有用。此外,扩展所需的单词集是微不足道的。

例如,

/.*jack\&.*james

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

同样地,

/\<\(\w*jack\&\w*james\)

jack将匹配包含和的变量名james,顺序不限。

有关使用的更多信息,请参阅此答案。我不知道有任何其他正则表达式风格可以实现分支;该运算符甚至没有记录在正则表达式维基百科条目中。


XPM*_*Mai 5

您可以利用正则表达式的量词功能,因为lookaround可能并不总是受支持。

(\bjames\b){1,}.*(\bjack\b){1,}|(\bjack\b){1,}.*(\bjames\b){1,}
Run Code Online (Sandbox Code Playgroud)