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