摘要:匹配字符對(duì)象屬性屬性描述對(duì)象是否具有標(biāo)志對(duì)象是否具有標(biāo)志一個(gè)整數(shù),標(biāo)識(shí)開始下一次匹配的字符位置對(duì)象是否具有標(biāo)志正則表達(dá)式的源文本對(duì)象方法檢索字符串中指定的值,返回或者。主機(jī)名允許數(shù)字和英文,長(zhǎng)度不確定。
參考資料:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
創(chuàng)建正則表達(dá)式對(duì)象有兩種創(chuàng)建正則表達(dá)式的方式
字面量
在腳本加載后編譯
正則表達(dá)式是靜態(tài)的時(shí)候性能會(huì)比較高
構(gòu)造函數(shù)
正則表達(dá)式運(yùn)行時(shí)編譯
適合需要?jiǎng)討B(tài)更改規(guī)則的情況
let reg1 = /ab+c/; // 字面量 let reg2 = new RegExp("ab+c"); // 構(gòu)造函數(shù) let reg3 = new RegExp("/ab+c/"); let reg4 = new RegExp(/ab+c/, i); // 同等 /ab+c/i
簡(jiǎn)單的使用使用構(gòu)造函數(shù)創(chuàng)建正則時(shí),第二個(gè)參數(shù)只能傳 "g"、"i" 和 "m",否則會(huì)出異常。
先看一個(gè)匹配qq號(hào)的例子,然后再根據(jù)這個(gè)例子往下看,這樣學(xué)起來(lái)會(huì)相對(duì)輕松。
qq號(hào)的規(guī)則:
全是數(shù)字
不能以0開頭 -> ^[1-9]{1} 簡(jiǎn)化-> ^[1-9]
最低5位,最高10位 -> [0-9]{4,9}$ 簡(jiǎn)化-> d{4,9}$
let reg = /^[1-9]{1}d{4,9}$/; reg.test("1234567890"); // true reg.test("12345678901"); // false reg.test("0234567890"); // false修飾符( i g m )
名稱 | 描述 | 例子 |
---|---|---|
i | 對(duì)大小寫不敏感 | /abc/i |
g | 全局匹配(不會(huì)在第一次匹配成功后停止) | /abc/g |
m | 多行匹配 | /abc/m |
字符范圍( [] )正則表達(dá)式默認(rèn)匹配成功后就不會(huì)繼續(xù)匹配。如果想匹配字符串中所有符合的子串,就要加g
使用[]表示定義匹配字符的范圍。
let reg = /[a-zA-z0-9]/; //匹配小寫和大寫的a-z還有0-9 console.log(reg.test("A")); // true console.log(reg.test("@")); // false
量詞reg.test()方法是RegExp對(duì)象方法,匹配成功返回true,否則返回false。
量詞 | 描述 | 例子 |
---|---|---|
n{x} | 匹配包含 X 個(gè) n 的序列的字符串。 | /[0-9]{4}/ |
n{x,y} | 匹配包含 X 至 Y 個(gè) n 的序列的字符串。 | /[0-9]{4,6}/ |
n{x,} | 匹配包含至少 X 個(gè) n 的序列的字符串。 | /[0-9]{4,}/ |
n* | 匹配任何包含零個(gè)或多個(gè) n 的字符串。 | /n*/ |
n+ | 匹配任何包含至少一個(gè) n 的字符串。 | /n+/ |
n? | 匹配任何包含零個(gè)或一個(gè) n 的字符串。 | /n?/ |
n$ | 匹配任何結(jié)尾為 n 的字符串。 | /n$/ |
^n | 匹配任何開頭為 n 的字符串。 | /^n/ |
?=n | 匹配任何其后緊接指定字符串 n 的字符串。 | /lo(?= java)/ |
?!n | 匹配任何其后沒有緊接指定字符串 n 的字符串。 | /lo(?! java)/ |
reg.test()方法,匹配字符串,匹配成功返回true,否則返回false
n{x} 匹配包含 X 個(gè) n 的序列的字符串。
let reg = /[0-9]{4}/; // 匹配4位連續(xù)的子串,范圍是0-9的數(shù)值 reg.test("1234"); // true reg.test("123"); // false reg.test("12a45"); // false
{x,y}:匹配包含 X 至 Y 個(gè) n 的序列的字符串。
let reg = /[0-9]{4,6}/; // 匹配4~6位連續(xù)的子串,范圍是0-9的數(shù)值 reg.test("12345"); // true reg.test("123"); // false reg.test("123a56"); // false
{x,}:匹配包含至少 X 個(gè) n 的序列的字符串。
let reg = /[0-9]{4,}/; // 匹配最少4位連續(xù)的子串,范圍是0-9的數(shù)值 reg.test("12345"); // true reg.test("123"); // false reg.test("123a567"); // false* + ?
reg.exec(),這個(gè)方法和test()差不多,區(qū)別在于返回值。匹配成功會(huì)返回一個(gè)數(shù)組,匹配失敗會(huì)返回null。
返回值的數(shù)組中還有一個(gè)index的參數(shù),這個(gè)參數(shù)是匹配到的子串所在字符串的起始索引。
*、+、?這仨解釋起來(lái)有點(diǎn)繞,直接看代碼會(huì)秒懂。
*:匹配任何包含零個(gè)或多個(gè) n 的字符串。
let reg = /n*/; reg.exec("n"); // ["n"] reg.exec("nnn"); // ["nnn"] reg.exec("aaa"); // [""],字符串中沒有n,但是*可以匹配沒有n的情況(零個(gè))
+:匹配任何包含至少一個(gè) n 的字符串。
let reg = /n+/; reg.exec("n"); // ["n"] reg.exec("nnn"); // ["nnn"] reg.exec("aaa"); // null
?:匹配任何包含零個(gè)或一個(gè) n 的字符串。
let reg = /n?/; reg.exec("n"); // ["n"] reg.exec("nnn"); // ["n"],無(wú)論有多少個(gè)連續(xù)的n,都只會(huì)匹配到一個(gè)。 reg.exec("aaa"); // [""]^和$(開頭和結(jié)尾)
^:匹配任何開頭為 n 的字符串。
let reg = /^n/; reg.test("nbcd"); // true reg.test("efghn"); // fasle
$:匹配任何結(jié)尾為 n 的字符串。
let reg = /n$/; reg.test("nbcd"); // fasle reg.test("efghn"); // true?= 和 ?!
?=n:匹配任何其后緊接指定字符串 n 的字符串。
// 匹配 lo,但是這個(gè)lo要在" java"之前 let reg = /lo(?= java)/; // 注意空格 reg.exec("hello javascript"); // ["lo"], index: 3
?!n:匹配任何其后沒有緊接指定字符串 n 的字符串。
// 匹配 lo,但是這個(gè)lo不能在" java"之前 let reg = /lo(?! java)/; // 注意空格 reg.exec("hello javascript lo"); // ["lo"], index: 17提取匹配字符串( () )
使用()提取匹配的字符串。表達(dá)式中有幾個(gè)()就有幾個(gè)相應(yīng)的匹配字符串。
可以通過(guò)$x的方式提取出來(lái)。(x表示一個(gè)數(shù)字)
let reg = /([w]+?)bc([d])/; let str = "abc123"; reg.exec(str); // ["abc1", "a", "1"],第二個(gè)元素是$1,第三個(gè)元素是$2 str.replace(reg, "$1$2"); //a123, reg匹配到的是"abc1",匹配到的字符串用$1和$2替換掉,所以結(jié)果是 a123元字符
元字符 | 描述 | 例子 |
---|---|---|
. | 查找單個(gè)字符,除了換行和行結(jié)束符。 | /h.t/ -> "hxt" |
w | 查找單詞字符。 | /w/ |
W | 查找非單詞字符。 | /W/ |
d | 查找數(shù)字。 | /d/ |
D | 查找非數(shù)字字符。 | /D/ |
s | 查找空白字符。 | /s/ |
S | 查找非空白字符。 | /S/ |
匹配單詞邊界。 | // | |
B | 匹配非單詞邊界。 | /B/ |