我不太了解正则表达式,我想创建一个匹配两个字符串的正则表达式。
我知道对于一个字符串,代码是.match(/something/)
,如果匹配两个字符串,它是.match(/something|someotherthing/)
如何编写一个仅在文本中找到两个字符串时才匹配的字符串,例如“google microsoft”
我不太了解正则表达式,我想创建一个匹配两个字符串的正则表达式。
我知道对于一个字符串,代码是.match(/something/)
,如果匹配两个字符串,它是.match(/something|someotherthing/)
如何编写一个仅在文本中找到两个字符串时才匹配的字符串,例如“google microsoft”
要使用单个正则表达式执行此操作,您需要考虑它们可以按任意顺序出现的事实。(.*
匹配两个子字符串之间的任何字符):
/google.*microsoft|microsoft.*google/
注意:如果您想做超过 2 个子字符串,这将失控。3 个字符串可以按6
不同顺序排列,5120
个字符串可以按顺序排列,10 个子字符串可以按3628800
不同顺序排列!这就是为什么使用语言(Javascript)本身的特性,比如在 Explosion Pills 的答案中,比试图用正则表达式做太多事情要好得多。
对于您的特定问题,其他答案非常好,但是正如 Paulpro 指出的那样,当您有两个以上的单词时,真的会失控。
最简单的方法是使用 Explosion Pills 建议的多重检查。
但是对于更具可扩展性的纯正则表达式方法,您可以使用前瞻:
/^(?=.*google)(?=.*microsoft)(?=.*apple).../
前瞻实际上不消耗任何东西,因此在检查第一个条件(.*google
可以匹配)之后,您回到字符串的开头并可以检查下一个条件。仅当所有前瞻都通过时,该模式才会通过。
请注意,如果您的输入可能包含换行符,.*
则不会这样做。您必须使用[^]*
or[\s\S]*
代替(其他人的答案也是如此)。
你可以只用.match
两次
str.match(/google/) && str.match(/microsoft/)
在这种情况下,使用起来可能会更快.indexOf
您还可以使用详细的正则表达式
.match(/google.*microsoft|microsoft.*google/)