正則表達(dá)式是一種用來匹配字符串的強(qiáng)有力的武器奈附。它的設(shè)計(jì)思想是用一種描述性的語言來給字符串定義一個(gè)規(guī)則醒串,凡是符合規(guī)則的字符串,我們就認(rèn)為它“匹配”了劫拢,否則胚嘲,該字符串就是不合法的作儿。
初級(jí)
- 在正則表達(dá)式中,如果直接給出字符馋劈,就是精確匹配攻锰。
-
\\d
可以匹配一個(gè)數(shù)字。
比如00\\d
可以匹配007
,但是00A
就不行啦妓雾。\\d\\d\\d
可以匹配123
娶吞。 -
\\w
可以匹配一個(gè)字母or數(shù)字or下劃線。
\\w\\w
可以匹配A1
-
\\s
匹配空白字符械姻。包括空格妒蛇、制表符、換頁符等楷拳。 -
.
可以匹配任意字符绣夺。
js.
可以匹配jsp
,js!
... - 用
*
表示任意個(gè)字符(包括0個(gè)) - 用
+
表示至少一個(gè)字符 - 用
?
表示0個(gè)或1個(gè)字符 - 用
{n}
表示n個(gè)字符
\\d{3}
表示匹配三個(gè)數(shù)字,如123
- 用
{n,m}
表示n-m個(gè)字符 - 特殊字符要用
\\
轉(zhuǎn)義
比如要匹配'010-12345'
由于'-'
是特殊字符欢揖,在正則表達(dá)式中陶耍,要用'\\'
轉(zhuǎn)義,所以浸颓,上面的正則是\\d{3}\\-\\d{3,8}
- 需要轉(zhuǎn)義的字符
* . ? + $ ^ [ ] ( ) { } | \\ /
-
\\b
是正則表達(dá)式規(guī)定的一個(gè)特殊代碼(好吧物臂,某些人叫它元字符,metacharacter)产上,代表著單詞的開頭或結(jié)尾棵磷,也就是單詞的分界處。
主要記住常用的\\d
數(shù)字晋涣、\\w
數(shù)字or字母or下劃線仪媒、\\s
空格or制表符or換頁符等的匹配。注意,都是小寫字母哦算吩。
進(jìn)階
- 更精確的匹配留凭,用
[]
表示范圍
[0-9a-zA-Z\\_]
可以匹配一個(gè)數(shù)字、字母或者下劃線
[0-9a-zA-Z\\_]+
可以匹配至少一個(gè)數(shù)字偎巢、字母或者下劃線
[a-zA-Z\\_\\$][0-9a-zA-Z\\_\\$]*
可以匹配由字母或下劃線蔼夜、$開頭,后接任意個(gè)由一個(gè)數(shù)字压昼、字母或者下劃線求冷、$組成的字符串,也就是JavaScript允許的變量名
[a-zA-Z\\_\\$][0-9a-zA-Z\\_\\$]{0, 19}
更精確地限制了變量的長度是1-20個(gè)字符,前面1個(gè)字符+后面最多19個(gè)字符 -
A|B
可以匹配A或B -
^
表示行的開頭窍霞,^\\d
表示必須以數(shù)字開頭匠题。 -
$
表示行的結(jié)束,\\d$
表示必須以數(shù)字結(jié)束但金。
創(chuàng)建RegExp的兩種方式
-
/正則表達(dá)式/
直接寫出 -
new RegExp('正則表達(dá)式')
創(chuàng)建一個(gè)RegExp對(duì)象
var re1 = /ABC\\-001/;
var re2 = new RegExp('ABC\\\\-001');// 因?yàn)檗D(zhuǎn)義問題韭山,字符串的兩個(gè)\\\\實(shí)際上是一個(gè)\\
re1; // /ABC\\-001/
re2; // /ABC\\-001/
檢測(cè) & RegExp對(duì)象的test()方法
用于檢測(cè)給定的字符串是否符合條件。
注意這是RegExp對(duì)象自己的方法冷溃,還有match()
钱磅、search()
、replace()
秃诵、split()
都是String對(duì)象的方法续搀。
var re = /^\\d{3}\\-\\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
切分字符串
可以用正則表達(dá)式來把不規(guī)范的輸入轉(zhuǎn)化成正確的數(shù)組塞琼。
'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']
//以空白符或者逗號(hào)來分割
'a,b;; c d'.split(/[\\s\\,\\;]+/); // ['a', 'b', 'c', 'd']
//以空白符或者逗號(hào)或者分好來分割
用問號(hào)實(shí)現(xiàn)非貪婪匹配
非貪婪模式盡可能少的匹配所搜索的字符串菠净,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。
var re = /^(\\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
解決:貪婪表達(dá)式字符的后面加個(gè)非貪婪符號(hào)?
當(dāng)?
緊跟在任何一個(gè)其他限制符 (*, +, ?, {*n*}, {*n*,}, {*n*,*m*})
后面時(shí)彪杉,匹配模式是非貪婪的毅往。例如,對(duì)于字符串 "oooo"派近,'o+?' 將匹配單個(gè) "o"攀唯,而 'o+' 將匹配所有 'o'
var re = /^(\\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
分組 & RegExp對(duì)象的exec()方法
如果正則表達(dá)式中定義了組,就可以在RegExp對(duì)象上用exec()方法提取出子串來
- 用
()
表示的就是要提取的分組(Group) -
JavaScript exec() 方法
exec()方法在匹配成功后渴丸,會(huì)返回一個(gè)Array侯嘀,第一個(gè)元素是正則表達(dá)式匹配到的整個(gè)字符串,后面的字符串表示匹配成功的子串谱轨。
exec()方法在匹配失敗時(shí)返回null戒幔。
如果在一個(gè)字符串中完成了一次模式匹配之后要開始檢索新的字符串,就必須手動(dòng)地把 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