正则表达式匹配可选前缀

时间:2015-10-05 06:11:05

标签: javascript regex

我有一串看起来像

的文字
 · 7:30pm · a/a · ★★ · fri sold out · Multi-day event ·

 · 7:30pm · a/a · ★★ · sold out · Multi-day event ·

如果该文本存在,我想捕获sold out;如果该文本存在,我想捕获fri sold out

我尝试的正则表达式是/^.*\s(\w*\ssold out|sold out).*$/,但这只是捕获sold out

如何捕获任意一串文字?

修改:我不会总是在任何一方拥有·个锚点。我也希望能够从中获取相同的信息,例如:

10pm · 21+ · ★ · late show - sold out ·

3 个答案:

答案 0 :(得分:4)

您可以在\w+前面捕捉一个可选的sold out(幸运的是,可以使用那个漂亮的实体sold out):

var rex = /((?:[\w]+ )?sold out)/;
var match = str.match(rex);
var text = match && match[1];

直播示例:

test("· 7:30pm · a/a · ★★ · fri sold out · Multi-day event ·");
test("· 7:30pm · a/a · ★★ · sold out · Multi-day event ·");
test("10pm · 21+ · ★ · late show - sold out ·");
function test(str) {
  var rex = /((?:[\w]+ )?sold out)/;
  var match = str.match(rex);
  var text = match && match[1];
  snippet.log("'" + str + "' =>");
  snippet.log("'" + text + "'");
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Here's an explanation of that regex,但基本上外部(...)是一个捕获组,然后(?:[\w]+ )?说“可选匹配一个或多个单词字符后跟一个空格” (非捕获组?之后的(?:...)是使其成为可选项的原因),当然sold out是我们的锚定文本。

答案 1 :(得分:2)

你几乎就在那里。您的模式问题是第一个.*

默认情况下,正则表达式引擎是贪婪的,.*尽可能多地消耗它,并且它优先于模式的其余部分(它在左侧)。要更改此行为,您可以使用lazy quantifier。添加额外的&#34;?&#34;在.*?中,它会尽可能少地重复。

/^.*?\s(\w*\ssold out|sold out).*$/

regex101 Demo

现在我们已经明确了什么是错的,让我们看看更多的东西。我认为\w*应该至少需要1个字符,所以我们可以更改量词并使用\w+。另外,我们可以使用non-capturing group缩短\w*\s的选项,从而缩短模式:

/^.*?\s((?:\w+\s)?sold out).*$/

如果你真的不需要匹配整行,你可以使用:

/\s((?:\w+\s)?sold out)/

regex101 Demo

答案 2 :(得分:1)

★+\s*\·\s*([^·]+)(?=·)

您可以使用此功能并抓住group。请参阅演示。

https://regex101.com/r/cJ6zQ3/1

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.
}