5

我有以下正则表达式:

   (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> 
4

2 回答 2

4

一种方法是把它拼出来:

^((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)确保至少有一个先前的空捕获组 ( )()参与了比赛。

于 2012-12-06T11:10:27.130 回答
2

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

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

现场演示

于 2012-12-06T11:12:44.317 回答