需要轉(zhuǎn)義的字符
[ ] / \ $ ^ ( ) ? | . + * { } = ! :
轉(zhuǎn)義方法:\[ \/ 等
/\/\[\!/.test('/[!') // ture
直接量
| 符號(hào) |
含義 |
| \o |
NUL 字符 |
| \t |
制表符 |
| \n |
換行 |
| \r |
回車(chē) |
| \xnn |
十六進(jìn)制拉丁字符 |
| \uxxxx |
十六進(jìn)制Unicode字符 |
字符類(lèi)
| 符號(hào) |
含義 |
| \w |
任何 ASCII字符組成的單詞 = [a-zA-Z0-9] |
| \W |
除 任何 ASCII字符組成的單詞 = [a-zA-Z0-9] 外字符 |
| \s |
任何 Unicode 空白符 |
| \S |
除 任何 Unicode 空白符 外字符 |
| \d |
任何 ASCII 數(shù)字 = [0-9] |
| \D |
除 任何 ASCII 數(shù)字 = [0-9] 外字符 |
| . |
除換行符和其他 Unicode 終止符以外 |
| [\b] |
退格符 |
| […] |
匹配方括號(hào)內(nèi)任一字符 |
| [^…] |
不匹配方括號(hào)內(nèi)任一字符 |
重復(fù)
| 符號(hào) |
含義 |
| {n, m} |
匹配 [n, m]次 |
| {n,} |
匹配 [n, *]次 |
| {n} |
匹配 [n, n]次 |
| ? |
匹配 [0, 1] 次 |
| + |
匹配 [1, *] 次 |
| * |
匹配 [0, *] 次 |
*以上均為貪婪匹配,非貪婪匹配添加一個(gè) ? 即可,如:??, +?, ?, {n, m}?
'aaaa'.match(/a+?/) //a
'aaaa'.match(/a+/) //aaaa
'aaaab'.match(/a+?b/) //注意:aaaab
選擇、分組、引用
| 符號(hào) |
含義 |
備注 |
| | |
選擇,匹配左邊字表達(dá)式或右邊子表達(dá)式 |
|
| (…) |
分組,可修飾 ? + * | 等,記住與該組匹配字符 |
|
| (?:…) |
只組合,用法同 分組,但不記憶匹配字符 |
|
| \n |
和第 n 個(gè)分組第一次匹配的字符相匹配,組索引為從左到右 ( 的索引,(?…) 不編碼 |
不能在字符類(lèi)中使用這種引用 |
`'a'bbb'b'`.match(/(['"])[^'"]*\1/)
//含義:匹配左右引號(hào),\1 匹配第一個(gè)括號(hào)子表達(dá)式匹配的模式
//結(jié)果:[ '\'a\'', '\'', index: 0, input: '\'a\'bbb\'b\'' ]
指定位置匹配
| 符號(hào) |
含義 |
| ^ |
匹配開(kāi)頭 |
| $ |
匹配結(jié)尾 |
| \b |
匹配單詞邊界,即位于 \w和\W 之間,或\w 和字符串開(kāi)頭或結(jié)尾之間 |
| \B |
匹配非單詞邊界 |
| (?=p) |
零寬正向先行斷言,接下來(lái)都與p匹配,但不能包括 p |
| (?!p) |
零寬負(fù)向先行斷言,接下來(lái)都不與p 匹配 |
不支持后行斷言,如:(?<=p) 以 p 為結(jié)尾
/Java(?!Script)([A-Z]\w*)/ //可以匹配 JavaBeans、不匹配 JavaScripter
/[Jj]ava([Ss]cript)?(?=\:)/ //可以匹配 JavaScript: 不匹配 JavaScriptbbb:
修飾符
| 符號(hào) |
含義 |
| i |
不區(qū)分大小寫(xiě)匹配 |
| g |
全局匹配,找到所有匹配 |
| m |
多行匹配,^ 匹配行頭,$ 匹配行尾 |
String 方法
/* 不支持全局搜索,自動(dòng)忽略 g, 參數(shù)可以是字符串,自動(dòng)轉(zhuǎn)換正則式
-----返回匹配子串起始位置-----
return 4
*/
const searchRegx = /script/i;
'JavaScript'.search(searchRegx);
/* -----返回?cái)?shù)組-----
match[0] 返回完整匹配,match[n] = $n
return ['1', '2', '3']
*/
const matchRegx = /\d+/g;
'1 plus 2 equal 3'.match(matchRegx)
/* -----用于查找和替換-----
1. 使用函數(shù)做參數(shù)
match 匹配子串
p1,p2... = $1,$2...
offset 偏移量
string 原串
*/
function replacer(match, p1, p2, p3, offset, string) {
// p1 is nondigits, p2 digits, and p3 non-alphanumerics
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
// 另: /([^\d]*)(\d*)([^\w]*)/ == /(\D*)(\d*)(\W*)/
// return abc-123345-#$*%
/* 2. 使用字符串做參數(shù)
$n
$$ 插入 $
$& 插入匹配字符串
$` 插入當(dāng)前子串左邊的內(nèi)容
$' 插入當(dāng)前子串右邊的內(nèi)容
*/
'"abc"bbb'.replace(/"([^"]*)"/g, '$1new');
// abcnewbbb
'bbb"abc"'.replace(/"([^"]*)"/g, '$`');
// bbbbbb
'bbb"abc"right'.replace(/"([^"]*)"/g, `$'`);
// bbbrightright
'bbb"abc""right"'.replace(/"([^"]*)"/g, `$'`);
//bbb"right"
//另:可用于平移字符
'1, 2, 3, 4'.split(/\s*, \s*/);
// [1, 2, 3, 4]
RegExp
// 注意: \\d
var zipcode = new RegExp("\\d{5}", "g");
// 等價(jià)。注意 lastIndex 的最后取值需要手動(dòng)置為 0。
zipcode.test("ziprc"); //返回 true
zipcode.exec("ziprc"); // 返回本次匹配結(jié)果
參考
30分鐘了解正則表達(dá)式
精通正則表達(dá)式
JavaScript 高級(jí)程序設(shè)計(jì)