11

我不太了解正则表达式,我想创建一个匹配两个字符串的正则表达式。

我知道对于一个字符串,代码是.match(/something/),如果匹配两个字符串,它是.match(/something|someotherthing/)

如何编写一个仅在文本中找到两个字符串时才匹配的字符串,例如“google microsoft”

4

3 回答 3

20

要使用单个正则表达式执行此操作,您需要考虑它们可以按任意顺序出现的事实。(.*匹配两个子字符串之间的任何字符):

/google.*microsoft|microsoft.*google/

注意:如果您想做超过 2 个子字符串,这将失控。3 个字符串可以按6不同顺序排列,5120个字符串可以按顺序排列,10 个子字符串可以按3628800不同顺序排列!这就是为什么使用语言(Javascript)本身的特性,比如在 Explosion Pills 的答案中,比试图用正则表达式做太多事情要好得多。

于 2013-08-28T19:35:52.430 回答
10

对于您的特定问题,其他答案非常好,但是正如 Paulpro 指出的那样,当您有两个以上的单词时,真的会失控。

最简单的方法是使用 Explosion Pills 建议的多重检查。

但是对于更具可扩展性的纯正则表达式方法,您可以使用前瞻

/^(?=.*google)(?=.*microsoft)(?=.*apple).../

前瞻实际上不消耗任何东西,因此在检查第一个条件(.*google可以匹配)之后,您回到字符串的开头并可以检查下一个条件。仅当所有前瞻都通过时,该模式才会通过。

请注意,如果您的输入可能包含换行符,.*则不会这样做。您必须使用[^]*or[\s\S]*代替(其他人的答案也是如此)。

于 2013-08-28T19:37:34.307 回答
8

你可以只用.match两次

str.match(/google/) && str.match(/microsoft/)

在这种情况下,使用起来可能会更快.indexOf

您还可以使用详细的正则表达式

.match(/google.*microsoft|microsoft.*google/)
于 2013-08-28T19:36:07.173 回答