suhiymof的專欄
部分規則:
用\d可以匹配一個數字,\w
可以匹配一個字母或數字,比如:
12\d可以匹配123,\d\d\d可以匹配123;
.
可以匹配任意字元
'js.'
可以匹配'jsp'
、'jss'
、'js!'
等等。
要匹配變長的字元,在正則表示式中,用*
表示任意個字元(包括0個),用+
表示至少一個字元,用?
表示0個或1個字元,用{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'
。
綜合起來,上面的正則表示式可以匹配以任意個空格隔開的帶區號的電話號碼。
如果要匹配'010-12345'
這樣的號碼呢?由於'-'
是特殊字元,在正則表示式中,要用'\'
轉義,所以,上面的正則是\d{3}\- \d{3,8}
。
但是,仍然無法匹配'010 - 12345'
,因為帶有空格。所以我們需要更復雜的匹配方式。
要做更精確地匹配,可以用[]
表示範圍,比如:
-
[0-9a-zA-Z\_]
可以匹配一個數字、字母或者下劃線; -
[0-9a-zA-Z\_]+
可以匹配至少由一個數字、字母或者下劃線組成的字串,比如'a100'
'0_Z'
,'js2015'
等等; -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]*
可以匹配由字母或下劃線、$開頭,後接任意個由一個數字、字母或者下劃線、$組成的字串,也就是JavaScript允許的變數名; -
[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}
更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元)。
A|B
可以匹配A或B,所以(J|j)ava(S|s)cript
可以匹配'JavaScript'
、'Javascript'
、'javaScript'
或者'javascript'
。
^
表示行的開頭,^\d
表示必須以數字開頭。
$
表示行的結束,\d$
表示必須以數字結束。
js
也可以匹配'jsp'
,但是加上^js$
就變成了整行匹配,就只能匹配'js'
了。
除了簡單地判斷是否匹配之外,正則表示式還有提取子串的強大功能。用()
表示的就是要提取的分組(Group)。比如:
javascript:^(\d{3})-(\d{3,8})$
分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
如果正則表示式中定義了組,就可以在RegExp
物件上用exec()
方法提取出子串來。
exec()
方法在匹配成功後,會返回一個Array
,第一個元素是正則表示式匹配到的整個字串,後面的字串表示匹配成功的子串。
exec()
方法在匹配失敗時返回null
。
再舉幾個js例子:
var re = /0+/;
var re2 = /^(0?[1-9]|1?[0-2])\:(0?[1-9]|1?[0-9]|2?[0-9]|3?[0-1])$/;
console.log('2:30'.split(re2)); // true
var re1 = /(\d{3})-(\d{3,8})-(\d{3})/;
console.log('010-12345-456'.split(/^(\d{3})-(\d{3,8})-(\d{3})$/)); // true
console.log(re1.exec('010-12345-456')); // ['010-12345', '010', '12345']
console.log(re1.exec('010-12345')); // null
console.log(re2.exec('02:01')); // null
var re3 = /^(\d+?)-(0*)$/;
console.log(re3.exec('10231024-00')); // ['102300', '1023', '00']
var re4 = /^(.+?)@(.+?)\.(com)$/;
輸出結果: