2011-11-08 57 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

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