仅提取第一个事件

时间:2011-11-08 22:44:11

标签: javascript regex

数据:

#r; 
 text
#r;

#r; 
  text2
#r;

正则表达式:

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

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

为了只获得第一次出现,我该怎么做?

3 个答案:

答案 0 :(得分:3)

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

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

/#r;.*?#r;/

匹配:

a pattern that starts with "#r;"
followed by any number of characters, but the fewest possible
followed by "#r;"

选项2:或者如果您只想获取分隔符之间的文本,可以使用它,然后引用搜索返回的[1]项:

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

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

您可以在此处看到它:http://jsfiddle.net/jfriend00/ZYdP8/

选项3:或者,如果每个#r之前和之后都有实际换行符;在你想要匹配的东西中,你会使用这个正则表达式:

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

您可以在此处查看:http://jsfiddle.net/jfriend00/ZYdP8/10/

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

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

您可以在此处查看:http://jsfiddle.net/jfriend00/ZYdP8/12/

答案 1 :(得分:0)

您的问题是,*与所有内容匹配,并且不会停留在近距离边界,因此最终会消耗" text\nr#;\n\nr#;\n text2\n"而不仅仅是" text\n"。解决方案是使*懒惰:

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

非贪婪的限定符(?之后的*)会导致*匹配足以使正则表达式整体起作用。

http://www.regular-expressions.info/possessive.html有更多信息:

  

贪婪的量词将首先尝试尽可能多地重复令牌,并逐渐放弃匹配,因为引擎回溯以找到整体匹配。延迟量词将首先根据需要重复令牌次数,并在引擎回溯到正则表达式以找到整体匹配时逐渐扩展匹配。

答案 2 :(得分:0)

试一试。

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