一、字符組
1.1
排除型
[^0-9] 表示 “0-9之外的字符“^”緊跟“[”表示“除什么什么之外”
排除型字符組只能排除單個(gè)字符
1.2 字符組簡(jiǎn)記
簡(jiǎn)記 | 對(duì)應(yīng)字符 | 說明 |
---|---|---|
\d | [0-9] | digit |
\w | [0-9a-zA-Z_] | word |
\s | [\t\r\n\v\f] | \t制表符 \r回車符 \n換行符 |
\D | [^\d] | 與\d相反 |
\W | [^\w] | 與\w相反 |
\S | [^\s] | 與\s相反 |
[\s\S] [\d\D] [\s\S] | 匹配任意字符 |
二、量詞
2.1 一般形式
量詞 | 說明 |
---|---|
{n} | 之前的元素必須出現(xiàn)n次 |
{m,n} | 之前的元素最少出現(xiàn)m次刀疙,最多出現(xiàn)n次 |
{m,} | 最少出現(xiàn)m次精盅,沒有上限 |
{0,n} | 0到n次 |
2.2 量詞簡(jiǎn)記法
常用量詞 | {m,n}等價(jià)方式 |
---|---|
* | {0,} |
+ | {1,} |
? | {0,1} |
2.3 點(diǎn)號(hào)
點(diǎn)號(hào)匹配任意字符供置,其中\(zhòng)n不能匹配
2.4 回溯
"[^"]"主要為了排除"hello world" world"這種情況况凉,
匹配優(yōu)先量詞
在拿不定是否要匹配的時(shí)候谚鄙,優(yōu)先嘗試匹配,并且記下這個(gè)狀態(tài)刁绒,以備將來后悔闷营。
" . " 在匹配"hello world" second"時(shí),會(huì)匹配第一個(gè)雙引號(hào)之后的所有字符知市,再進(jìn)行回溯傻盟,表達(dá)式中的"匹配了字符串的字符"速蕊,整個(gè)匹配宣告完畢。
————————————————————
. 優(yōu)先匹配莫杈,知道匹配最后一個(gè)字符互例,發(fā)現(xiàn)都是符合 . 這個(gè)狀態(tài)的奢入。
開始回溯筝闹。
最后一個(gè)字符符合,結(jié)束腥光。
2.5 忽略優(yōu)先量詞
<script type="text/javascript">
alert('hello world');
</script>
<br/>
<script type="text/javascript">
alert("I think you're right");
</script>
匹配:
<script type="text/javascript">[/s/S]*</script>
匹配優(yōu)先量詞會(huì)優(yōu)先匹配最后一個(gè)字符关顷,這時(shí)候已經(jīng)沒有匹配的字符了,但正則表達(dá)式中的”</script>“還沒有匹配到武福,所以只能查詢之前保存?zhèn)溆玫臓顟B(tài)议双,看看能不能回退幾步,照顧“</script>”的匹配捉片。查詢到最近保存的狀態(tài)是:【“</script>”也可能是[/s/S]不應(yīng)該匹配的】平痰。于是讓[/s/S]反悔對(duì)”</script>“的匹配,所以整個(gè)匹配過程宣告成功伍纫。
匹配的結(jié)果是:
alert('hello world');
</script>
<br/>
<script type="text/javascript">
alert("I think you're right");
這樣和我們的預(yù)期并不相同宗雇。
我們需要采用忽略優(yōu)先量詞
如果不確定要匹配,忽略優(yōu)先量詞會(huì)選擇“不匹配”的狀態(tài)莹规,再嘗試表達(dá)式中之后的元素赔蒲,如果嘗試失敗,再回溯良漱,選擇之前保存的“匹配”的狀態(tài)舞虱。
也就是,當(dāng)遇到”<“字符時(shí)母市,[/s/S]選擇不匹配矾兜,嘗試將“</script>”與表達(dá)式中的“</script>”比較,比較成功患久,返回成功的字符串焕刮。
正確的寫法是
<script type="text/javascript">[/s/S]*?</script>
*與*?的區(qū)別在于,在實(shí)際匹配的過程中墙杯,遇到[/s/S]能匹配的字符配并,先嘗試忽略,如果后面的元素不能匹配(即“</script>”)高镐,再嘗試匹配溉旋。直到匹配到第一個(gè)出現(xiàn)的“</script>”為止。
匹配優(yōu)先量詞 和 忽略優(yōu)先量詞相比嫉髓,匹配優(yōu)先量詞效率更高观腊。
2.6 轉(zhuǎn)義
一般量詞的轉(zhuǎn)義邑闲,例如{m,n},如果希望匹配{m,n}梧油,直接加上{m,n}即可
*? 的轉(zhuǎn)義 是 /*/?
三苫耸、括號(hào)
3.1 分組
身份證號(hào)碼
15位都是數(shù)字&首字母不能為0
18位 前17位是數(shù)字&首字母不能為0,末位可能是數(shù)字|字母x
說明 | 對(duì)應(yīng)字符 |
---|---|
首位是數(shù)字儡陨,不能為0 | [1-9] |
去除首末2位褪子,剩下13位或16位,都是數(shù)字 | \d{13, 16} |
末位可能是數(shù)字骗村,也可能是x | [0-9x] |
即
[1-9]\d{13, 16}[0-9x]
但這樣寫是不對(duì)的嫌褪,不能匹配。
我們可以采用括號(hào)的方式改變量詞的作用元素
[1-9]\d{14}(\d{2}[0-9x])?
3.2 多選結(jié)構(gòu)
結(jié)構(gòu)形式為:
(...|...)
上面的身份證號(hào)可以表示為:
([1-9]\d{14}|[1-9]\d{16}[0-9x])
匹配0~255之間的數(shù)字
((00)?[0-9]|0?[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
手機(jī)號(hào)
(0|\+86)?(13[0-9]|15[0-356]|18[025-9])\d{8}
四胚股、斷言
4.1 單詞邊界
說明:
表達(dá)式 | 說明 |
---|---|
\brow\b | 只能是單詞row |
\brow | 例如row笼痛、rowdy等 |
row\b | 例如row、tomorrow等 |
用\b\w+\b來匹配一個(gè)句子中的單詞琅拌。
4.2
^ 開始
$ 結(jié)束
4.3 環(huán)視
名字 | 記法 | 判斷方向 | 結(jié)構(gòu)內(nèi)表達(dá)式匹配成功的返回值 |
---|---|---|---|
肯定順序環(huán)視 | (?=...) | 向右 | True |
否定順序環(huán)視 | (?!...) | 向右 | False |
肯定逆序環(huán)視 | (?<=...) | 向左 | True |
否定逆序環(huán)視 | (?<!...) | 向左 | False |
舉個(gè)例子:
<(?!/) 表示<右側(cè)不能出現(xiàn)/缨伊,它和<[^/]類似,但卻不同进宝。
<(?!/)匹配的僅僅只有<
<[^/]匹配<及其后面一個(gè)字符
環(huán)視最大的特點(diǎn)是“匹配完成之后還停留在原地”
格式化數(shù)字
(?<=\d)(?=(\d{3})+(?!\d))
'123456'.replace(/(?<=\d)(?=(\d{3})+(?!\d))/u, ',')
分析:
字符串可拆分為(?<=\d)和(?=(\d{3})+(?!\d))
(?<=\d)表示 當(dāng)前字符左側(cè)必須要出現(xiàn)數(shù)字
(?=(\d{3})+(?!\d))表示字符右側(cè)必須要出現(xiàn)(\d{3})+(?!\d)
(\d{3})+(?!\d)可拆分
(\d{3})+表示三個(gè)連續(xù)數(shù)字至少出現(xiàn)1次
(?!\d)表示右側(cè)必定不能出現(xiàn)數(shù)字
五刻坊、匹配模式
5.1
表達(dá)式 | 說明 |
---|---|
\regex\i | 不區(qū)分大小寫 |
dotALL(點(diǎn)號(hào)通配) | 單行模式 |
\regex\m | 多行模式 |
\regex\x | 注釋模式 |
\regex\u | 表示按unicode(utf-8)匹配(主要針對(duì)多字節(jié)比如漢字) |
\regex\s | 表示將字符串視為單行來匹配 |
六、捕獲分組的引用
6.1
如果要在正則表達(dá)式內(nèi)部引用捕獲分組即彪,則應(yīng)當(dāng)使用\num記法紧唱,其中num為對(duì)應(yīng)捕獲分組的編號(hào)
/^([a-z])\1$/u.test("aa") //true
如果要在replacement字符串中引用捕獲分組,則應(yīng)當(dāng)使用$num記法隶校。
"2019-10-28".replace(/(\d{4})-(\d{2})-(\d{2})/u, "$2/$3/$1") //10/28/2019
如需表示$符號(hào)漏益,必須轉(zhuǎn)義為$$
"the price is 12.99".replace(/(\d+\.\d{0,2})/u, "$$$1"); //the price is $12.99
6.2 命名分組
用法:
(?<name>regex)
栗子:
pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
result = pattern.exec("2019-10-30");
6.3(與6.1對(duì)應(yīng))
在正則表達(dá)式內(nèi)部引用捕獲分組,應(yīng)當(dāng)使用\k<name>記法
/^(?<char>[a-z])\k<char>$/u.test('aa');
regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
replacement = "$<month>/$<day>/$<year>"
"2019-10-30".replace(regex, replacement); //"10/30/2019"
"the price is 12.99".replace(/(?<money>\d+\.\d{0,2})/u, "$$$<money>");
七深胳、