標籤:
Regex就是一個用來描述字元模式的對象。它被用來在文本中執行模式比對(pattern-matching)以及”尋找-替換”(search-and-replace)的任務。javascript中正則的風格類似Perl中正則的風格。
建立
var reg = new RegExp(pattern,modifiers);
或
var reg = /pattern/modifiers;
modifiers包括
- g : 執行全域匹配(尋找所有匹配而非在找到第一個匹配後停止)
如
‘Hey, Is this all there Is ‘.replace(/Is/g, ‘is‘);//替換某字串中所有的Is為is
- i : 執行對大小寫不敏感的匹配
- m : 執行多行匹配,具體見這裡
ps 建立一正則時可多個模式,如 /hEllO/ig
正則相關方法
在字串方法中,有match方法,與exec類似。如
‘The best things in life are free‘.match(/e/); //["e"]
正則中的元字元
Regex中的元字元是用來替代一類具有相同屬性的字元的特殊字元,它也可以被稱為字元類(character class)。
- . 尋找單個字元,除了換行和行結束符。
- \w 尋找單詞字元(字母、數字以及底線”_”)。
- \W 尋找非單詞字元。
- \d 尋找數字。
- \D 尋找非數字字元。
- \s 尋找空白字元。
- \S 尋找非空白字元。
- \b 匹配單詞邊界。
- \B 匹配非單詞邊界。
- \0 尋找 NUL 字元。
- \n 尋找分行符號。
- \f 尋找換頁符。
- \r 尋找斷行符號符。
- \t 尋找定位字元。
- \v 尋找垂直定位字元。
- \xxx 尋找以八位元 xxx 規定的字元。
- \xdd 尋找以十六進位數 dd 規定的字元。
- \uxxxx 尋找以十六進位數 xxxx 規定的 Unicode 字元。
Regex中的括弧大括弧 ()
進行分組。好比email地址,我們就可以將它分為
- @前面的部分;
- @後面’.’之前的部分;
- ’.’之後的部分;
如果要匹配所有gamil郵箱中@前的使用者名稱中帶有jack的替換為joel‘[email protected]‘.replace(/^(\w*)(jack)(\w*)@gmail\.com$/, ‘[email protected]‘); //"iamjo[email protected]"
這種類似於模組化的思想,不僅使我們一次可以專註於尋找其中的一個小部分,也可以讓我們在後面可以輕鬆的替換其中的某個部分,而不需要糾結於“牽一髮而動全身”的痛苦。
方括弧 []
用於尋找某個範圍內的字元
- [abc] 尋找方括弧之間的任何字元。
- [^abc] 尋找任何不在方括弧之間的字元。
- [0-9] 尋找任何從 0 至 9 的數字。
- [a-z] 尋找任何從小寫 a 到小寫 z 的字元。
- [A-Z] 尋找任何從大寫 A 到大寫 Z 的字元。
- [A-z] 尋找任何從大寫 A 到小寫 z 的字元。
- [adgk] 尋找方括弧內的任何字元。
- [^adgk] 尋找不在方括弧內的任何字元。
量詞
匹配多個。如匹配3個數字可用正則/\d{3}/。
- n+ 匹配任何包含至少一個 n 的字串。
- n* 匹配任何包含零個或多個 n 的字串。
- n? 匹配任何包含零個或一個 n 的字串。
- n{X} 匹配包含 X 個 n 的序列的字串。
- n{X,Y} 匹配包含 X 或 Y 個 n 的序列的字串。
- n{X,} 匹配包含至少 X 個 n 的序列的字串。
- n$ 匹配任何結尾為 n 的字串。
- ^n 匹配任何開頭為 n 的字串。
- ?=n 匹配任何其後緊接指定字串 n 的字串。
- ?!n 匹配任何其後沒有緊接指定字串 n 的字串。
習題
- 在字串”1.5 0 123 -7 -0.4”裡面匹配帶小數點的數,無論是正的還是負的。
- 在字串”1.5 0 123”中匹配數字([1.5,0,123]),無論是整數還是小數。
- 更多習題
進階貪婪和非貪婪模式
預設正則匹配是貪婪模式的,即前面的正則匹配儘可能多的。如
/(\d+)(\d+)/.exec(‘12345‘);//結果["12345", "1234", "5"]
開啟非貪婪模式,量詞後面加?
如
/(\d+?)(\d+)/.exec(‘12345‘);//結果["12345", "1", "2345"]
更詳細的的解釋,點這裡
非捕獲性分組
在括弧內容以?:開頭。如:
/(?:\d+)\d+/.exec(‘123‘);// 結果 ["123"]
匹配
Lookaround 是 向前匹配(Lookahead) 和 向後匹配(Lookbehind) 的統稱。
向前匹配
包括向前正向匹配(Positive Lookahead)和向前負向匹配(Negative Lookahead),文法是 ?= 和 ?!。
前正向匹配:匹配任何其後緊接指定字串 n 的字串。
向前負向匹配:匹配任何其後沒有緊接指定字串 n 的字串。
類似的還有向後匹配。
在javascript目前只能使用 Lookahead,還無法使用 Lookbehind。
Lookaround 參考教程:http://www.regular-expressions.info/lookaround.html
正則拓展庫
xregexp特性
- 支援所有的ES5的正則的文法。
- 相容 Explorer 5.5+, Firefox 1.5+, Chrome, Safari 3+, and Opera 11+。在nodejs上也可以使用。
- 比原生正則可讀性高。
- 比原生正則易用。
更多資源
參考
- http://www.w3school.com.cn/js/jsref_obj_regexp.asp
- http://www.html-js.com/article/A-day-to-learn-JavaScript-JavaScript-regular-expressions-a
- http://javascript.info/tutorial/regular-expressions-javascript
- https://github.com/lifesinger/lifesinger.github.com/issues/162#wechat_redirect
習題答案
- ‘1.5 0 123 -7 -0.4‘.match(/(-?\d+.\d+)/g)
- ‘1.5 0 123‘.match(/(\d+.?\d+)|0/g)
推薦拓展閱讀
javascriptRegex介紹