正則表達(dá)式的定義:用來描述或匹配一系列匹配某個(gè)句法規(guī)則的字符串。
正則的語(yǔ)法有哪些:
1. 選擇
豎線 | 料滥,最低優(yōu)先級(jí)
2. 數(shù)量限定
+ 代表符號(hào)前面的字符至少出現(xiàn)一次 (一次 ~ 多次)
册倒?代表符號(hào)前面的字符最多可以出現(xiàn)一次 (0次婴谱、1次)
* 代表符號(hào)前面的字符可以出現(xiàn) (0次 ~ 多次)
{n} 出現(xiàn)n次
{n,} 最少出現(xiàn)n次甜橱,范圍在n~∞
{n,m} 出現(xiàn)次數(shù)n~m之間
3. 匹配
() 定義操作符的范圍和優(yōu)先級(jí)
4. 正則表達(dá)式
字符 | 描述 | 示例 |
---|---|---|
^ | 匹配開始位置 | c |
$ | 匹配結(jié)束位置 | c |
. | 匹配除\r \n 之外的單個(gè)字符 | c |
\ | 標(biāo)記特殊字符 | n桐早、\n |
x|y | 匹配x或者y | c |
[xyz] | 匹配x或y或z任意一個(gè) | c |
[^xyz] | 匹配未列出的任意字符 | c |
[a-z] | 匹配a-z范圍內(nèi)的小寫字母 | c |
[^a-z] | 匹配不在a-z范圍內(nèi)的字符 | c |
\b | 匹配一個(gè)單詞邊界 | er\b : 匹配 never 中的 er 癣缅,不匹配 verb 中的 er |
\B | 匹配非單詞邊界 | er\B : 不匹配 never 中的 er 厨剪,匹配 verb 中的 er |
\d | 匹配一個(gè)數(shù)字 | 等價(jià)于[0-9] |
\D | 匹配一個(gè)非數(shù)字 | 等價(jià)于[^0-9] |
\f | 匹配一個(gè)換頁(yè)符 | 等價(jià)于\x0c和\cL |
\n | 匹配一個(gè)換行符 | 等價(jià)于\x0a和\cJ |
\r | 匹配一個(gè)回車符 | 等價(jià)于\x0d和\cM |
\s | 匹配任何空白字符 | 等價(jià)于[ \f\n\r\t\v] |
\S | 匹配任何非空白字符 | 等價(jià)于 [^ \f\n\r\t\v] |
\t | 匹配一個(gè)制表符 | 等價(jià)于\x09和\cI |
\v | 匹配一個(gè)垂直制表符 | 等價(jià)于\x0b和\cK |
\w | 匹配包括下劃線的任何單詞字符 | 等價(jià)于[A-Za-z0-9_] |
\W | 匹配任何非單詞字符 | 等價(jià)于[^A-Za-z0-9_] |
\cx | 匹配由x指明的控制字符,x的值必須為A-Z或a-z | \cM匹配一個(gè)Control-M或回車符友存。\ca等效于\u0001, \cb等效于\u0002 |
(pattern) | 用括號(hào)括起來表示一個(gè)子模式祷膳,匹配pattern并獲取這一匹配的子字符串。該子字符串用于向后引用 | |
(?:pattern) | 匹配pattern但不獲取匹配的子字符串 | industr(?:y | ies)屡立, industry | industries |
(?=pattern) | 正向肯定預(yù)查直晨,非獲取匹配 | |
(?!pattern) | 正向否定預(yù)查,非獲取匹配 | |
(?<=pattern) | 反向肯定預(yù)查膨俐,非獲取匹配 | |
(?<!pattern) | 反向否定預(yù)查勇皇,非獲取匹配 |
正則表達(dá)式的獲取匹配和非獲取匹配
用括號(hào)括起來表示一個(gè)子模式,這個(gè)子模式就是一個(gè)獲取匹配焚刺,如果在子模式的前面加上 ?:敛摘、 ?! 、?<=檩坚、 ?<!着撩,就成為非獲取匹配
<div id="test">
Windows 103
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
</div>
<button onclick='reg_replace()'>替換</button>
function reg_replace()
{
var test = document.getElementById("test");
var regex = /(Windows [\w]+\b)/g; // 加上括號(hào)獲取匹配
var regex2 = /Windows [\w]+\b/g; // 去掉括號(hào) 非獲取匹配
var regex3 = /(?:Windows [\w]+\b)/g; //加上?: 非獲取匹配
test.innerHTML = test.innerHTML.replace(regex,"<span style='background-color:orange'>$1</span>");
}
獲取匹配會(huì)把子模式中保存起來,用于向后引用匾委,同時(shí)可以使用$1引用,一個(gè)括號(hào)代表一個(gè)子模式氓润,$1 表示匹配第一個(gè)括號(hào)里的字符串赂乐,如果有多個(gè)()包含,順序依次向后加 $1 $2 $3 ……$n
非獲取匹配
(?:pattern) 匹配結(jié)果咖气。Java(?:6|7)等效于Java6|Java7挨措,在需要使用()的情況下,同時(shí)不需要把匹配的內(nèi)容進(jìn)行保存崩溪,后面也不需要引用浅役,可以用這種方式,同時(shí)也是對(duì)資源的節(jié)約
在非獲取匹配下伶唯,也不會(huì)擁有分組的組號(hào)
零寬斷言
零寬度的匹配觉既,查找某個(gè)內(nèi)容之前或者之后的內(nèi)容,匹配的內(nèi)容不會(huì)保存到對(duì)應(yīng)的匹配結(jié)果中乳幸,僅僅匹配了一個(gè)位置瞪讼。
1. 正向預(yù)查
(?=pattern) 正向匹配。Java(?=6)粹断,匹配后面跟著6的Java
(?!pattern) 正向不匹配符欠。Java(?!6),匹配后面不跟著6的Java
2. 反向預(yù)查
(?<=pattern) 反向匹配瓶埋。(?<=J)a希柿,匹配緊跟字母J后面的a
(?<!pattern) 反向不匹配诊沪。(?<!J)a,不匹配緊跟字母J后面的a
正則replace特殊標(biāo)記符$
字符 | 替換文本 |
---|---|
$1曾撤、$2娄徊、...、$99 | 與 regexp 中的第 1 到第 99 個(gè)子表達(dá)式相匹配的文本盾戴。 |
$& | 與 regexp 相匹配的子串寄锐。 |
$` | 位于匹配子串左側(cè)的文本。 |
$' | 位于匹配子串右側(cè)的文本尖啡。 |
$$ | 直接量符號(hào)橄仆。 |
正則replace應(yīng)用—千分制
// 整數(shù)千分制
let a = '99999999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,');
// 可以包含小數(shù)點(diǎn)后兩位的千分制
var b = '99999999999.02'.replace(/\d{1,3}(?=(\d{3})+(?:\.\d{1,2})?$)/g, '$&,');
正則符號(hào)的優(yōu)先級(jí)
優(yōu)先權(quán) | 符號(hào) |
---|---|
最高 | \ |
高 | ()、(?:)衅斩、(?=)盆顾、[] |
中 | *、+畏梆、?您宪、{n}、{n,}奠涌、{n,m} |
低 | ^宪巨、$、中介字符 |
次最低 | 串接溜畅,即相鄰字符連接在一起 |
最低 | | |
正則的貪婪&非貪婪
貪婪模式捏卓,匹配盡可能多的,屬于貪婪模式的量詞包括 {n,m} {m,} ? * +
非貪婪模式慈格,匹配盡可能少的怠晴,在貪婪模式基礎(chǔ)上再加上?即為非貪婪模式浴捆。
var str='aabab';
var reg=/a.*?b/g;
var res=str.match(reg);
console.log(res);
結(jié)果:
["aab", "ab"]
先匹配aab蒜田,再匹配ab,由于從左向右最先開始的匹配有最高優(yōu)先級(jí)