2011-11-08 28 views
0

数据:提取第一发生仅

#r; 
text 
#r; 

#r; 
    text2 
#r; 

正则表达式:

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

我刚要提取的第一只发生(即#r;text#r;)。但是,以下模式提取两个匹配。

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

+0

这看起来像是一个重复的http://stackoverflow.com/questions/2074452/regex-to-first-occurence-only – MetaEd

回答

0

您的问题是,*匹配所有内容,并没有停在最近的边界,所以它最终消耗了" text\nr#;\n\nr#;\n text2\n"而不仅仅是" text\n"。解决的办法是使*懒:

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

非贪婪限定符(在*?)导致*只是足够匹配的正则表达式作为一个整体来工作。

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

贪婪量词将首先尝试重复令牌多次成为可能,并逐渐放弃匹配,而发动机回溯找到一个整体的匹配。一个懒惰的量词将首先根据需要重复该记号,并且随着引擎在正则表达式中回溯以找到整体匹配,逐渐扩展匹配。

+0

thnx一吨..你们摇滚 – ahhmarr

0

试一试。

/#r;[\w\W](?=#r;)/ 
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/

3选项:或者,(以汤姆的建议),如果你不希望任何形式的空白是搭配上边界的一部分,你可以使用这个:

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

你可以在这里看到工作:http://jsfiddle.net/jfriend00/ZYdP8/12/

+0

我会建议像'/#r; \ S * \ S *#R(*。); /'。这是一个统一的正则表达式,既可以在'#r'标签之间包含空格时使用,也可以在不包含空格时使用。 –

+0

@TomKnapen - 好建议汤姆。我不确定OP的空白需求是什么。我不知道文本中是否真的存在换行符,并且他们是否希望其他空白符合匹配的一部分。我在我的回答结尾添加了这个建议。 – jfriend00

+0

'。*?'不能匹配多行序列吗? –