我应该使用| (管)还是? (问号)?

时间:2012-10-14 22:56:40

标签: javascript regex

我有分组括号()(?: ),即使括号内的表达式不匹配,我也需要匹配。我已经看到|?都用于此(即(a|b|c|)(a|b|c)?),但哪些应该使用/更有效,为什么?

由于不同的JavaScript引擎不同地解释正则表达式,我特意使用SpiderMonkey引擎。然而,一般化(语言方面和引擎方式)答案会很好。

编辑:一个具体的例子是DuckDuckGo Frequency goodie。在这种情况下,作者为什么选择|而不是?

2 个答案:

答案 0 :(得分:1)

根据你的描述,听起来恰当的选择是?量词,它直接允许parens之间的前一组可选地匹配。

另一方面,如果您想要匹配模式中的一个,则会使用|

答案 1 :(得分:1)

要查看效果,请参阅this fiddle


使用?进行分组或|使用空字符串作为选项可能会导致意外结果!

情侣测试:

var myString = "this is a test string"; 
var myRegexp = /(test)?/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a string"; 
var myRegexp = /(test)?/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a test string"; 
var myRegexp = /(test|)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a string"; 
var myRegexp = /(test|)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a test string"; 
var myRegexp = /(test)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns "test"

这个以错误结束:

var myString = "this is a string"; 
var myRegexp = /(test)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // error

这个可能是你的解决方案:

var myString = "this is a test string"; 
var myRegexp = /^(?:.*(test)|(?!.*test))/; 
var match = myRegexp.exec(myString); 
alert(match[1]); // returns "test"

var myString = "this is a string"; 
var myRegexp = /^(?:.*(test)|(?!.*test))/; 
var match = myRegexp.exec(myString); 
alert(match[1]); // returns undefined

使用this fiddle测试上述代码。