在正则表达式中匹配第一组,第二组或两者

时间:2012-12-06 11:01:20

标签: javascript regex

我有以下正则表达式:

   (electric|acoustic) (guitar|drums)

我需要的是匹配:

    electric guitar
    electric drums
    acoustic guitar
    acoustic drums
    electric 
    acoustic
    guitar 
    drums

我试过用过?两组之后,但它匹配一切。谢谢!

编辑:

<script type="text/javascript">
 var s = "electric drums";

 if(s.match('^(?:electric()|acoustic())? ?(?:guitar()|drums())?(?:\1|\2|\3|\4)$')){
    document.write("match");
 } else {
    document.write("no match"); // returns this
 }
</script> 

2 个答案:

答案 0 :(得分:3)

一种方法是拼写出来:

^((electric|acoustic) (guitar|drums)|(electric|acoustic|guitar|drums))$

或(因为你不需要捕捉括号)

^(?:(?:electric|acoustic) (?:guitar|drums)|(?:electric|acoustic|guitar|drums))$

如果您不想重复自己,也可以使用技巧:

^(?:electric()|acoustic())? ?(?:guitar()|drums())?(?:\1|\2|\3|\4)$

(?:\1|\2|\3|\4)确保至少有一个以前的空捕获组(())参与了比赛。

答案 1 :(得分:2)

使用这样的基于前瞻性的正则表达式:

(?=.*?(?:electric|acoustic|guitar|drums))^(?:electric|acoustic|) ?(?:guitar|drums|)$

Live Demo