正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規則,凡是符合規則的字符串,我們就認為它“匹配”了,否則,該字符串就是不合法的。
初級
- 在正則表達式中,如果直接給出字符,就是精確匹配。
-
\\d
可以匹配一個數字。
比如00\\d
可以匹配007
,但是00A
就不行啦。\\d\\d\\d
可以匹配123
。 -
\\w
可以匹配一個字母or數字or下劃線。
\\w\\w
可以匹配A1
-
\\s
匹配空白字符。包括空格、制表符、換頁符等。 -
.
可以匹配任意字符。
js.
可以匹配jsp
,js!
... - 用
*
表示任意個字符(包括0個) - 用
+
表示至少一個字符 - 用
?
表示0個或1個字符 - 用
{n}
表示n個字符
\\d{3}
表示匹配三個數字,如123
- 用
{n,m}
表示n-m個字符 - 特殊字符要用
\\
轉義
比如要匹配'010-12345'
由于'-'
是特殊字符,在正則表達式中,要用'\\'
轉義,所以,上面的正則是\\d{3}\\-\\d{3,8}
- 需要轉義的字符
* . ? + $ ^ [ ] ( ) { } | \\ /
-
\\b
是正則表達式規定的一個特殊代碼(好吧,某些人叫它元字符,metacharacter),代表著單詞的開頭或結尾,也就是單詞的分界處。
主要記住常用的\\d
數字、\\w
數字or字母or下劃線、\\s
空格or制表符or換頁符等的匹配。注意,都是小寫字母哦。
進階
- 更精確的匹配,用
[]
表示范圍
[0-9a-zA-Z\\_]
可以匹配一個數字、字母或者下劃線
[0-9a-zA-Z\\_]+
可以匹配至少一個數字、字母或者下劃線
[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 -
^
表示行的開頭,^\\d
表示必須以數字開頭。 -
$
表示行的結束,\\d$
表示必須以數字結束。
創建RegExp的兩種方式
-
/正則表達式/
直接寫出 -
new RegExp('正則表達式')
創建一個RegExp對象
var re1 = /ABC\\-001/;
var re2 = new RegExp('ABC\\\\-001');// 因為轉義問題,字符串的兩個\\\\實際上是一個\\
re1; // /ABC\\-001/
re2; // /ABC\\-001/
檢測 & RegExp對象的test()方法
用于檢測給定的字符串是否符合條件。
注意這是RegExp對象自己的方法,還有match()
、search()
、replace()
、split()
都是String對象的方法。
var re = /^\\d{3}\\-\\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
切分字符串
可以用正則表達式來把不規范的輸入轉化成正確的數組。
'a b c'.split(' '); // ['a', 'b', '', '', 'c']
'a b c'.split(/\\s+/); // ['a', 'b', 'c']
//以空白符作為分割
'a,b, c d'.split(/[\\s\\,]+/); // ['a', 'b', 'c', 'd']
//以空白符或者逗號來分割
'a,b;; c d'.split(/[\\s\\,\\;]+/); // ['a', 'b', 'c', 'd']
//以空白符或者逗號或者分好來分割
用問號實現非貪婪匹配
非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。
var re = /^(\\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
解決:貪婪表達式字符的后面加個非貪婪符號?
當?
緊跟在任何一個其他限制符 (*, +, ?, {*n*}, {*n*,}, {*n*,*m*})
后面時,匹配模式是非貪婪的。例如,對于字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'
var re = /^(\\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
分組 & RegExp對象的exec()方法
如果正則表達式中定義了組,就可以在RegExp對象上用exec()方法提取出子串來
- 用
()
表示的就是要提取的分組(Group) -
JavaScript exec() 方法
exec()方法在匹配成功后,會返回一個Array,第一個元素是正則表達式匹配到的整個字符串,后面的字符串表示匹配成功的子串。
exec()方法在匹配失敗時返回null。
如果在一個字符串中完成了一次模式匹配之后要開始檢索新的字符串,就必須手動地把 lastIndex 屬性重置為 0。
var re = /^(\\d{3})-(\\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null
var str = "Visit W3School, W3School is a place to study web technology.";
var patt = new RegExp("W3School","g");
var result;
while ((result = patt.exec(str)) != null) {
document.write(result);
document.write("<br />");
document.write(patt.lastIndex);
document.write("<br />");
}
輸出:
W3School
14
W3School
24