JavaScript 正則表達(dá)式 handbook

需要轉(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ì)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容