字符串是編程時涉及到的最多的一種數據結構,而正則表達式是用來匹配字符串的強有力武器。javascript
首先,瞭解如何用字符描述字符。java
\d
能夠匹配一個數字\w
能夠匹配一個字母或數字\s
能夠匹配一個空格(也包括Tab等空白符).
能夠匹配任意字符*
表示任意個字符(包括0個)+
表示至少有一個字符?
表示0個或一個{n}
表示n個字符{n,m}
表示n——m個字符舉例:\d{3}\s+\d{3,8}
正則表達式
\d{3}
表示匹配3個數字,例如'010';\s
能夠匹配一個空格(也包括Tab等空白符),因此\s+
表示至少有一個空格,例如匹配' '
,'\t\t'
等;\d{3,8}
表示3-8個數字,例如'1234567'
。綜合起來,上面的正則表達式能夠匹配以任意個空格隔開的帶區號的電話號碼。編程
[]
表示範圍。####[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
能夠匹配由字母或下劃線、\(開頭,後接任意個由一個數字、字母或者下劃線、\)組成的字符串,也就是JavaScript容許的變量名.數組
A|B
能夠匹配A或B,因此[J|j]ava[S|s]cript
能夠匹配'JavaScript'、'Javascript'、'javaScript'或者'javascript'。數據結構
^表示行的開頭,^\d
表示必須以數字開頭。jsp
\(表示行的結束,`\d\)`表示必須以數字結束。測試
你可能注意到了,js
也能夠匹配'jsp'
,可是加上^js$
就變成了整行匹配,就只能匹配'js'
了。spa
JavaScript有兩種方式建立一個正則表達式:code
第一種方式是直接經過/正則表達式/
寫出來,第二種方式是經過new RegExp
('正則表達式')建立一個RegExp對象。
兩種寫法是同樣的:
var re1 = /ABC\-001/; var re2 = new RegExp('ABC\\-001'); re1; // /ABC\-001/ re2; // /ABC\-001/
注意,若是使用第二種寫法,由於字符串的轉義問題,字符串的兩個\\
其實是一個\
。
先看看如何判斷正則表達式是否匹配:
var re = /^\d{3}\-\d{3,8}$/; re.test('010-12345'); // true re.test('010-1234x'); // false re.test('010 12345'); // false
RegExp對象的test()方法
用於測試給定的字符串是否符合條件。
若是用戶輸入了一組標籤,能夠用正則表達式來把不規範的輸入轉化成正確的數組。
'a,b;; c d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']
用()
表示的就是要提取的分組(Group)。好比:
^(\d{3})-(\d{3,8})$
分別定義了兩個組,能夠直接從匹配的字符串中提取出區號和本地號碼
若是正則表達式中定義了組,就能夠在RegExp對象上用exec()方法提取出子串來。
exec()方法在匹配成功後,會返回一個Array,第一個元素是正則表達式匹配到的整個字符串,後面的字符串表示匹配成功的子串。
exec()方法在匹配失敗時返回null。
var re = /^(\d{3})-(\d{3,8})$/; re.exec('010-12345'); // ['010-12345', '010', '12345'] re.exec('010 12345'); // null
JavaScript的正則表達式還有幾個特殊的標誌,最經常使用的是g,表示全局匹配:
var r1 = /test/g; // 等價於: var r2 = new RegExp('test', 'g');
全局匹配能夠屢次執行exec()方法來搜索一個匹配的字符串。當咱們指定g標誌後,每次運行exec(),正則表達式自己會更新lastIndex屬性,表示上次匹配到的最後索引。
全局匹配相似搜索,所以不能使用/^...$/,那樣只會最多匹配一次。
正則表達式還能夠指定i標誌,表示忽略大小寫,m標誌,表示執行多行匹配。