TIPS-Javascript RegExp比對要如何包含換行符號?

寫了一個Javascript函數抓出字串中以#符號夾住的文字片段:

function extract(s) {
    var re = /#.+#/;
    var p = re.exec(s);
    if (p) return p[0]; else return "";
}
function test(s) {
    var t = extract(s);
    alert("String:" + t + "\nLength:" + t.length);
}
//String:#easy# Length:6
test("This is a #easy# sample.");
//String:#easy sample# Length:13
test("This is a #easy sample#.");
//破功了,只得到空字串
test("This is a #tough\nsample#.");

當輸入字串裡#之間包夾\n換行時,RegExp比對失敗了。在一般語言的Regular Expression中,有個Single Line Option可以解決這個問題。例如在.NET中,可加上(?s):

不過,在Javascript中似乎不支援s選項,寫成/#.+#/s會導致錯誤。爬文查到一位Sharepoint MVP的文章,原來目前大部分的瀏覽器都還不支援RegExp的Single-Line選項,有善心人士另外寫了XRegExp,對Javascript RegExp做了補強。(XRegExp還支援 ?<name> 這個超好用的具名群組語法,如此說來,才覺得Javascript裡的RegExp真是陽春!)

如果不想加外掛,另一個解法是用[\s\S]取代.。在本例中,改寫為/#[\s\S]+#/便可達到期望的效果。

歡迎推文分享:
Published 24 August 2010 08:53 PM 由 Jeffrey
Filed under: ,
Views: 11,112



意見

# 小湯 said on 12 April, 2011 03:30 AM

感謝有幫到忙的好文章

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<August 2010>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication