數據:提取第一發生僅
#r;
text
#r;
#r;
text2
#r;
正則表達式:
/#r;[\w\W]*#r;/
我剛要提取的第一隻發生(即#r;text#r;
)。但是,以下模式提取兩個匹配。
我應該怎麼做才能得到第一個出現?
數據:提取第一發生僅
#r;
text
#r;
#r;
text2
#r;
正則表達式:
/#r;[\w\W]*#r;/
我剛要提取的第一隻發生(即#r;text#r;
)。但是,以下模式提取兩個匹配。
我應該怎麼做才能得到第一個出現?
您的問題是,*
匹配所有內容,並沒有停在最近的邊界,所以它最終消耗了" text\nr#;\n\nr#;\n text2\n"
而不僅僅是" text\n"
。解決的辦法是使*
懶:
/#r;[\w\W]*?#r;/
非貪婪限定符(在*
後?
)導致*
只是足夠匹配的正則表達式作爲一個整體來工作。
http://www.regular-expressions.info/possessive.html有更多的信息:
貪婪量詞將首先嚐試重複令牌多次成爲可能,並逐漸放棄匹配,而發動機回溯找到一個整體的匹配。一個懶惰的量詞將首先根據需要重複該記號,並且隨着引擎在正則表達式中回溯以找到整體匹配,逐漸擴展匹配。
thnx一噸..你們搖滾 – ahhmarr
試一試。
/#r;[\w\W](?=#r;)/
見選擇以下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/。
我會建議像'/#r; \ S * \ S *#R(*。); /'。這是一個統一的正則表達式,既可以在'#r'標籤之間包含空格時使用,也可以在不包含空格時使用。 –
@TomKnapen - 好建議湯姆。我不確定OP的空白需求是什麼。我不知道文本中是否真的存在換行符,並且他們是否希望其他空白符合匹配的一部分。我在我的回答結尾添加了這個建議。 – jfriend00
'。*?'不能匹配多行序列嗎? –
這看起來像是一個重複的http://stackoverflow.com/questions/2074452/regex-to-first-occurence-only – MetaEd