Javascript 仅提取第一个引用

Javascript 仅提取第一个引用,javascript,regex,Javascript,Regex,数据: 正则表达式: #r; text #r; #r; text2 #r; 我只想提取第一个匹配项(即\r;text\r;)。但是,以下模式正在提取这两个匹配项 我应该怎么做才能只得到第一次出现?您的问题是*匹配所有内容,并且不会在接近边界处停止,因此它最终会消耗“text\nr\nr\ntext2\n”,而不仅仅是“text\n”。解决方案是使*变懒: /#r;[\w\W]*#r;/ 非贪婪限定符(在*之后的?)使*刚好匹配整个正则表达式 有更多信息: 贪婪的量词将首先尝试尽可

数据:

正则表达式:

#r; 
 text
#r;

#r; 
  text2
#r;
我只想提取第一个匹配项(即
\r;text\r;
)。但是,以下模式正在提取这两个匹配项


我应该怎么做才能只得到第一次出现?

您的问题是
*
匹配所有内容,并且不会在接近边界处停止,因此它最终会消耗
“text\nr\nr\ntext2\n”
,而不仅仅是
“text\n”
。解决方案是使
*
变懒:

/#r;[\w\W]*#r;/
非贪婪限定符(在
*
之后的
)使
*
刚好匹配整个正则表达式

有更多信息:

贪婪的量词将首先尝试尽可能多地重复标记,并随着引擎回溯以找到整体匹配,逐渐放弃匹配。惰性量词将首先根据需要重复标记几次,并在引擎回溯正则表达式以找到整体匹配时逐渐扩展匹配


您的问题是,
*
匹配所有内容,并且不会在接近边界处停止,因此它最终会消耗
“text\nr\n\nr\ntext2\n”
,而不仅仅是
“text\n”
。解决方案是使
*
变懒:

/#r;[\w\W]*#r;/
非贪婪限定符(在
*
之后的
)使
*
刚好匹配整个正则表达式

有更多信息:

贪婪的量词将首先尝试尽可能多地重复标记,并随着引擎回溯以找到整体匹配,逐渐放弃匹配。惰性量词将首先根据需要重复标记几次,并在引擎回溯正则表达式以找到整体匹配时逐渐扩展匹配

试试这个

/#r;[\w\W]*?#r;/
试试这个

/#r;[\w\W]*?#r;/

请参见下面的选项4作为最佳推荐选项

选项1:不使用lookaheads和非贪婪通配符匹配,您可以使用以下正则表达式:

/#r;[\w\W](?=#r;)/
/#r;(.*?)#r;/

"#r;text1#r;#r;text2#r;".match(/#r;(.*?)#r;/)[1] == "text1"
这符合:

/#r;.*?#r;/
选项2:或者,如果只想获取分隔符之间的文本,可以使用此选项,然后引用搜索返回的[1]项:

a pattern that starts with "#r;"
followed by any number of characters, but the fewest possible
followed by "#r;"
你可以在这里看到它的作用:

选项3:或者,如果在每个#r之前和之后都有换行符;在您试图匹配的对象中,您将使用以下正则表达式:

/#r;[\w\W](?=#r;)/
/#r;(.*?)#r;/

"#r;text1#r;#r;text2#r;".match(/#r;(.*?)#r;/)[1] == "text1"
您可以在此处看到它的工作方式:

选项4:或者(采纳Tom的建议),如果您不希望任何类型的空白成为边界匹配的一部分,您可以使用以下选项:

/#r;\n(.*?)\n#r;/

您可以在此处看到:请参见下面的选项4,作为最佳推荐选项

选项1:不使用lookaheads和非贪婪通配符匹配,您可以使用以下正则表达式:

/#r;[\w\W](?=#r;)/
/#r;(.*?)#r;/

"#r;text1#r;#r;text2#r;".match(/#r;(.*?)#r;/)[1] == "text1"
这符合:

/#r;.*?#r;/
选项2:或者,如果只想获取分隔符之间的文本,可以使用此选项,然后引用搜索返回的[1]项:

a pattern that starts with "#r;"
followed by any number of characters, but the fewest possible
followed by "#r;"
你可以在这里看到它的作用:

选项3:或者,如果在每个#r之前和之后都有换行符;在您试图匹配的对象中,您将使用以下正则表达式:

/#r;[\w\W](?=#r;)/
/#r;(.*?)#r;/

"#r;text1#r;#r;text2#r;".match(/#r;(.*?)#r;/)[1] == "text1"
您可以在此处看到它的工作方式:

选项4:或者(采纳Tom的建议),如果您不希望任何类型的空白成为边界匹配的一部分,您可以使用以下选项:

/#r;\n(.*?)\n#r;/

你可以在这里看到:。

这看起来像是这个的复制品看起来像是的复制品,我建议像
/\r\s*(*?)\s*#r/。这是一个统一的正则表达式,当
\r标记,但也包括没有空格的情况。@TomKnapen-很好的建议Tom。我不确定OP的空白需要什么。我不知道文本中是否真的有换行符,他们是否希望其他空格成为匹配的一部分。我在回答的末尾添加了这个建议。
*?
是否无法匹配多行序列?@MikeSamuel-我不确定您指的是什么问题。这个问题不需要返回一个包含行边界的匹配,所有示例JSFIDLE中都有行边界,没有问题。@jfriend00,看看我从您的示例中得到的结果。我建议使用类似于
/\r\s*(*?)\s*#r/。这是一个统一的正则表达式,当
\r标记,但也包括没有空格的情况。@TomKnapen-很好的建议Tom。我不确定OP的空白需要什么。我不知道文本中是否真的有换行符,他们是否希望其他空格成为匹配的一部分。我在回答的末尾添加了这个建议。
*?
是否无法匹配多行序列?@MikeSamuel-我不确定您指的是什么问题。这个问题不需要返回一个包含线边界的匹配项,所有示例JSFIDLE中都有线边界,没有问题。@jfriend00,看一下我从您的示例中派生的内容。