我有分组括号()
和(?: )
,即使括号内的表达式不匹配,我也需要匹配。我已经看到|
和?
都用于此(即(a|b|c|)
和(a|b|c)?
),但哪些应该使用/更有效,为什么?
由于不同的JavaScript引擎不同地解释正则表达式,我特意使用SpiderMonkey引擎。然而,一般化(语言方面和引擎方式)答案会很好。
编辑:一个具体的例子是DuckDuckGo Frequency goodie。在这种情况下,作者为什么选择|
而不是?
?
答案 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测试上述代码。