我有一串看起来像
的文字 · 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 ·
答案 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).*$/
现在我们已经明确了什么是错的,让我们看看更多的东西。我认为\w*
应该至少需要1个字符,所以我们可以更改量词并使用\w+
。另外,我们可以使用non-capturing group缩短\w*\s
的选项,从而缩短模式:
/^.*?\s((?:\w+\s)?sold out).*$/
如果你真的不需要匹配整行,你可以使用:
/\s((?:\w+\s)?sold out)/
答案 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.
}