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,看一下我从您的示例中派生的内容。