Javascript 要匹配可选前缀的正则表达式
我有一个文本字符串,看起来像Javascript 要匹配可选前缀的正则表达式,javascript,regex,Javascript,Regex,我有一个文本字符串,看起来像 · 7:30pm · a/a · ★★ · fri sold out · Multi-day event · 或 我想捕获售罄(如果该文本存在)或fri售罄(如果该文本存在) 我尝试的正则表达式是/^.*\s(\w*\ssold out | salled out)。*$/但这只是捕获salled out 如何捕获任一文本字符串 编辑:我不会总是让·锚定在两侧。我还希望能够从中获取相同的信息,即: 10pm · 21+ · ★ · late show - sold
· 7:30pm · a/a · ★★ · fri sold out · Multi-day event ·
或
我想捕获售罄
(如果该文本存在)或fri售罄
(如果该文本存在)
我尝试的正则表达式是/^.*\s(\w*\ssold out | salled out)。*$/
但这只是捕获salled out
如何捕获任一文本字符串
编辑:我不会总是让·
锚定在两侧。我还希望能够从中获取相同的信息,即:
10pm · 21+ · ★ · late show - sold out ·
您可以在售罄的
前面捕获一个可选的\w+
(幸运的是,您可以使用售罄的这个漂亮的实体):
现场示例:
测试(“·7:30pm·a/a·”★★ · 周五售罄·多日活动·”);
测试(“·下午7:30·a/a·”★★ · 售罄·多日活动·”);
测试(“晚上10点·21+·”★ · 晚展-售罄·”);
功能测试(str){
var rex=/((?:[\w]+)?已售罄)/;
var match=str.match(rex);
var text=match&&match[1];
log(“'”+str+“=>”);
snippet.log(“'”+text+“”);
}
您可以使用它并抓取组
。请参阅演示
你快到了。模式的问题是第一个*
默认情况下,正则表达式引擎是贪婪的,*
消耗尽可能多的资源,并且它优先于模式的其余部分(位于左侧)。要更改此行为,可以使用。在*?
中添加额外的“?”使其重复次数尽可能少
/^.*?\s(\w*\ssold out|sold out).*$/
现在我们已经弄清楚了问题所在,让我们再看一些事情。我认为\w*
至少需要1个字符,因此我们可以更改量词并使用\w+
。此外,我们还可以使用将\w*\s
设置为可选,从而缩短模式:
/^.*?\s((?:\w+\s)?sold out).*$/
如果您实际上不需要匹配整条线,您可以使用:
/\s((?:\w+\s)?sold out)/
另一个技巧,如果您想缩短它:/^.*?\s((?:\w*\s)?售罄)。*$/
即使是更新的版本也比需要的更复杂。:-)@我知道T.J.Crowder,但我更喜欢简单地指出OP的正则表达式失败的地方,而不是添加新概念。。。我们不知道OP是否出于某种原因需要匹配整行,也不知道他/她是否在多行模式下验证文本。
var re = /★+\s*\·\s*([^·]+)(?=·)/g;
var str = ' · 7:30pm · a/a · ★★ · fri sold out · Multi-day event ·\n\nor\n\n · 7:30pm · a/a · ★★ · sold out · Multi-day event ·';
var m;
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
// View your result using the m-variable.
// eg m[0] etc.
}
/^.*?\s(\w*\ssold out|sold out).*$/
/^.*?\s((?:\w+\s)?sold out).*$/
/\s((?:\w+\s)?sold out)/