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)/