数据:
#r;
text
#r;
#r;
text2
#r;
正则表达式:
/#r;[\w\W]*#r;/
我只想提取第一次出现(即#r;text#r;
)。但是,以下模式正在提取两个匹配项。
为了只获得第一次出现,我该怎么做?
答案 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;)/