最近在學(xué)PHP跃须,js時(shí)需要用到正則表達(dá)式蒙具,盡管在學(xué)Python時(shí)學(xué)了一些但是不夠系統(tǒng)球榆。每次看到繁瑣的正則,就淺嘗輒止禁筏。在此做一個(gè)總結(jié)持钉,以便自己后續(xù)的學(xué)習(xí)。
什么是正則表達(dá)式
正則表達(dá)式(regular expression)
描述了一種字符串匹配的模式篱昔,按照某種規(guī)則去匹配符合條件的字符串每强。
為什么使用正則表達(dá)式?
通過(guò)使用正則表達(dá)式州刽,可以:
- 測(cè)試字符串內(nèi)的模式空执。
例如,可以測(cè)試輸入字符串穗椅,以查看字符串內(nèi)是否出現(xiàn)電話號(hào)碼模式或信用卡號(hào)碼模式辨绊。這稱為數(shù)據(jù)驗(yàn)證。
- 查找匹表,替換文本门坷。
可以使用正則表達(dá)式來(lái)識(shí)別文檔中的特定文本,完全刪除該文本或者用其他文本替換它桑孩。
- 基于模式匹配從字符串中提取子字符串。
可以查找文檔內(nèi)或輸入域內(nèi)特定的文本框冀。
正則表達(dá)式語(yǔ)法
正則表達(dá)式由兩種基本字符類(lèi)型組成:
原義文本字符
元字符
元字符是正則表達(dá)式中有特殊含義的非字母字符流椒。
普通字符
普通字符包括沒(méi)有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫(xiě)和小寫(xiě)字母明也、所有數(shù)字宣虾、所有標(biāo)點(diǎn)符號(hào)和一些其他符號(hào)。
非打印字符
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符温数。例如绣硝,\cM匹配一個(gè)Control-M或回車(chē)符。x的值必須為A-Z或a-z之一撑刺。否則鹉胖,將c視為一個(gè)原義的'c'字符。 |
\f | 匹配一個(gè)換頁(yè)符。等價(jià)于 \x0c 和 \cL甫菠。 |
\n | 匹配一個(gè)換行符挠铲。等價(jià)于 \x0a 和 \cJ。 |
\r | 匹配一個(gè)回車(chē)符寂诱。等價(jià)于 \x0d 和 \cM拂苹。 |
\s | 匹配任何空白字符,包括空格痰洒、制表符瓢棒、換頁(yè)符等等。等價(jià)于 [ \f\n\r\t\v]丘喻。 |
\S | 匹配任何非空白字符脯宿。等價(jià)于 [^ \f\n\r\t\v]。 |
\t | 匹配一個(gè)制表符仓犬。等價(jià)于 \x09 和 \cI嗅绰。 |
\v | 匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK搀继。 |
特別字符
所謂特殊字符窘面,就是一些有特殊含義的字符,如上面說(shuō)的"*.txt"中的*叽躯,簡(jiǎn)單的說(shuō)就是表示任何字符串的意思财边。如果要查找文件名中有*的文件,則需要對(duì)*進(jìn)行轉(zhuǎn)義点骑,即在其前加一個(gè)\酣难。ls *.txt。正則表達(dá)式有以下特殊字符黑滴。
字符 | 描述 |
---|---|
$ | 匹配輸入字符串的結(jié)尾位置憨募。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'袁辈。要匹配 $ 字符本身菜谣,請(qǐng)使用 $。 |
( ) | 標(biāo)記一個(gè)子表達(dá)式的開(kāi)始和結(jié)束位置晚缩。子表達(dá)式可以獲取供以后使用尾膊。要匹配這些字符,請(qǐng)使用 \( 和 \) 荞彼。 |
* | 匹配前面的子表達(dá)式零次或多次冈敛。要匹配 * 字符,請(qǐng)使用 \* 鸣皂。 |
+ | 匹配前面的子表達(dá)式一次或多次抓谴。要匹配 + 字符暮蹂,請(qǐng)使用 \+ 。 |
. | 匹配除換行符 \n之外的任何單 字符齐邦。要匹配 .椎侠,請(qǐng)使用 \。 |
[ | 標(biāo)記一個(gè)中括號(hào)表達(dá)式的開(kāi)始措拇。要匹配 [我纪,請(qǐng)使用 \[ 。 |
? | 匹配前面的子表達(dá)式零次或一次丐吓,或指明一個(gè)非貪婪限定符浅悉。要匹配 ? 字符,請(qǐng)使用 ?券犁。 |
\ | 將下一個(gè)字符標(biāo)記為或特殊字符术健、或原義字符、或向后引用粘衬、或八進(jìn)制轉(zhuǎn)義符荞估。例如, 'n' 匹配字符 'n'稚新。'\n' 匹配換行符勘伺。序列 '\\ ' 匹配 "",而 '\( ' 則匹配 "( "褂删。 |
^ | 匹配輸入字符串的開(kāi)始位置飞醉,除非在方括號(hào)表達(dá)式中使用,此時(shí)它表示不接受該字符集合屯阀。要匹配 ^ 字符本身缅帘,請(qǐng)使用 \^ 。 |
{ | 標(biāo)記限定符表達(dá)式的開(kāi)始难衰。要匹配 {钦无,請(qǐng)使用 \{ 。 |
丨 | 指明兩項(xiàng)之間的一個(gè)選擇盖袭。要匹配 丨失暂,請(qǐng)使用 \丨 。 |
在表格里輸入
|
嘗試過(guò)\|
苍凛,但可以用中文gun來(lái)假裝一下哈哈哈哈
限定符
限定符用來(lái)指定正則表達(dá)式的一個(gè)給定組件必須要出現(xiàn)多少次才能滿足匹配趣席。有*或+或?或{n}或{n,}或{n,m}共6種兵志。
*醇蝴、+和?限定符都是貪婪的,因?yàn)樗鼈儠?huì)盡可能多的匹配文字想罕,只有在它們的后面加上一個(gè)?就可以實(shí)現(xiàn)非貪婪或最小匹配悠栓。
字符 | 描述 |
---|---|
* | 匹配前面的子表達(dá)式零次或多次霉涨。例如,zo* 能匹配 "z" 以及 "zoo"惭适。* 等價(jià)于{0,}笙瑟。 |
+ | 匹配前面的子表達(dá)式一次或多次。例如癞志,'zo+' 能匹配 "zo" 以及 "zoo"往枷,但不能匹配 "z"。+ 等價(jià)于 {1,}凄杯。 |
? | 匹配前面的子表達(dá)式零次或一次错洁。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 戒突。? 等價(jià)于 {0,1}屯碴。 |
{n} | n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次膊存。例如导而,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個(gè) o隔崎。 |
{n,} | n 是一個(gè)非負(fù)整數(shù)今艺。至少匹配n 次。例如仍稀,'o{2,}' 不能匹配 "Bob" 中的 'o'洼滚,但能匹配 "foooood" 中的所有 o。'o{1,}' 等價(jià)于 'o+'技潘。'o{0,}' 則等價(jià)于 'o*'遥巴。 |
{n,m} | m 和 n 均為非負(fù)整數(shù),其中n <= m享幽。最少匹配 n 次且最多匹配 m 次铲掐。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個(gè) o值桩。'o{0,1}' 等價(jià)于 'o?'摆霉。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格。 |
定位符
用來(lái)描述字符串或單詞的邊界奔坟。
^和$分別指字符串的開(kāi)始與結(jié)束携栋。
\b描述單詞的前或后邊界。
\B表示非單詞邊界咳秉。
注:不能對(duì)定位符使用限定符婉支。
操作符優(yōu)先級(jí)
轉(zhuǎn)義符 > 圓括號(hào)和方括號(hào) > 限定符 > 位置和順序 > “或”操作
一些匹配規(guī)則
我們可以用[]
來(lái)構(gòu)建一個(gè)簡(jiǎn)單的類(lèi)。所謂的類(lèi)就是指符合某些特性的對(duì)象澜建,即匹配方括號(hào)內(nèi)任意一個(gè)都可向挖。 當(dāng)在一組方括號(hào)里使用^是蝌以,它表示“非”或“排除”的意思,常常用來(lái)剔除某個(gè)字符何之。即反向類(lèi)跟畅。另外,還給我們提供了范圍類(lèi)溶推,連字號(hào)可以表示一個(gè)字符的范圍徊件,[a-z]即匹配所有的小寫(xiě)字母。
下面舉一些例子:
[a-z] //匹配所有的小寫(xiě)字母
[A-Z] //匹配所有的大寫(xiě)字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的數(shù)字
[0-9.-] //匹配所有的數(shù)字蒜危,句號(hào)和減號(hào)
[ \f\r\t\n] //匹配所有的白字符
\d 匹配一個(gè)數(shù)字字符庇忌。等價(jià)于 [0-9]。
\D 匹配一個(gè)非數(shù)字字符舰褪。等價(jià)于 [^0-9]皆疹。
另外,特殊字符"."等價(jià)[^\r\n]
在正規(guī)表達(dá)式中用來(lái)表示除了回車(chē)換行之外的所有字符占拍。
"\d"等價(jià)[0-9]
在正規(guī)表達(dá)式中用來(lái)表示數(shù)字字符略就。
"\D"等價(jià)[^0-9]
在正規(guī)表達(dá)式中用來(lái)表示非數(shù)字字符。
"\s"等價(jià)[\t\n\x0B\f\r]
在正規(guī)表達(dá)式中用來(lái)表示空白符晃酒。
"\S"等價(jià)[^\t\n\x0B\f\r]
在正規(guī)表達(dá)式中用來(lái)表示非空白符表牢。
"\w"等價(jià)[a-zA-Z_0-9]
在正規(guī)表達(dá)式中用來(lái)表示數(shù)字字母下劃線。
"\W"等價(jià)[^a-zA-Z_0-9]
在正規(guī)表達(dá)式中用來(lái)表示非單詞字符贝次。
量詞
到現(xiàn)在為止崔兴,你已經(jīng)知道如何去匹配一個(gè)字母或數(shù)字,但更多的情況下蛔翅,可能要匹配一個(gè)單詞或一組數(shù)字敲茄。一個(gè)單詞有若干個(gè)字母組成,一組數(shù)字有若干個(gè)單數(shù)組成山析。跟在字符或字符簇后面的花括號(hào)({})用來(lái)確定前面的內(nèi)容的重復(fù)出現(xiàn)的次數(shù)堰燎。
如:
^a{4}$ aaaa
^a{2,}$ 包含多于兩個(gè)a的字符串
^a{1,3}$ a,aa或aaa
這些例子描述了花括號(hào)的三種不同的用法。一個(gè)數(shù)字笋轨,{x}的意思是“前面的字符或字符簇只出現(xiàn)x次”秆剪;一個(gè)數(shù)字加逗號(hào),{x,}的意思是“前面的內(nèi)容出現(xiàn)x或更多的次數(shù)”爵政,之前所說(shuō)的+
即表示比配一次或多次仅讽,等同于{1,};兩個(gè)用逗號(hào)分隔的數(shù)字钾挟,{x,y}表示“前面的內(nèi)容至少出現(xiàn)x次洁灵,但不超過(guò)y次”。
^[a-zA-Z0-9_]{1,}$ //所有包含一個(gè)以上的字母等龙、數(shù)字或下劃線的字符串
^[0-9]{1,}$ //所有的正數(shù)
^-{0,1}[0-9]{1,}$ //所有的整數(shù)
^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ //所有的小數(shù)
另外处渣,?
字符表示出現(xiàn)零次或一次(最多出現(xiàn)一次)蛛砰;
+
字符表示出現(xiàn)一次或多次(至少出現(xiàn)一次);
*
字符表示出現(xiàn)零次或多次(任意次)罐栈;
分組
在某些情況,如果想匹配apple3次泥畅,估計(jì)大家會(huì)這樣寫(xiě):apple{3}
可是查找結(jié)果卻是:
因此荠诬,我們需要用到()
分組。應(yīng)該寫(xiě)成(apple){3}
選擇
用圓括號(hào)將所有選擇項(xiàng)括起來(lái)位仁,相鄰的選擇項(xiàng)之間用|分隔柑贞。但用圓括號(hào)會(huì)有一個(gè)副作用,是相關(guān)的匹配會(huì)被緩存聂抢,此時(shí)可用?:
放在第一個(gè)選項(xiàng)前來(lái)消除這種副作用钧嘶。
反向引用
對(duì)一個(gè)正則表達(dá)式模式或部分模式兩邊添加圓括號(hào)將導(dǎo)致相關(guān)匹配存儲(chǔ)到一個(gè)臨時(shí)緩沖區(qū)中,所捕獲的每個(gè)子匹配都按照在正則表達(dá)式模式中從左至右所遇到的內(nèi)容存儲(chǔ)琳疏。存儲(chǔ)子匹配的緩沖區(qū)編號(hào)從 1 開(kāi)始有决,連續(xù)編號(hào)直至最大 99 個(gè)子表達(dá)式。每個(gè)緩沖區(qū)都可以使用 '\n' 訪問(wèn)空盼,其中 n 為一個(gè)標(biāo)識(shí)特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)书幕。
可以在分組內(nèi)加上非捕獲元字符 '?:', '?=', or '?!' 來(lái)忽略對(duì)相關(guān)匹配的保存。
前瞻
正則表達(dá)式從文本頭部向尾部開(kāi)始解析揽趾,文本尾部方向稱為前
台汇。
前瞻就是在正則表達(dá)式匹配到規(guī)則的時(shí)候,向前檢查是否符合斷言篱瞎,后顧則相反苟呐。正向前瞻和負(fù)向前瞻就是判斷一個(gè)正則之后還沒(méi)有完,還需要在符合一個(gè)條件俐筋。
符合和不符合特定斷言稱之為肯定/正向匹配和否定/反向匹配掠抬。
正向前瞻 exp(?=assert)
反向前瞻 exp(?!assert)
正向后顧 exp(?<=assert)
反向后顧 exp(?<!assert)
(js不支持后顧)
exp為原正則部分,assert部分即斷言部分也是正則表達(dá)式校哎,?=
和?!
两波,前者為正向前瞻,在任何開(kāi)始匹配圓括號(hào)內(nèi)的正則表達(dá)式模式的位置來(lái)匹配搜索字符串闷哆,后者為負(fù)向前瞻腰奋,在任何開(kāi)始不匹配該正則表達(dá)式模式的位置來(lái)匹配搜索字符串。
javascript 中正則表達(dá)式的應(yīng)用
js中通過(guò)內(nèi)置對(duì)象REGEXP支持正則表達(dá)式抱怔。
有兩種方法實(shí)例化RegExp對(duì)象:
1.字面量 var reg = / \bis\b /g;
2.構(gòu)造函數(shù) var reg = new RegExp ('\bis\b','g');/*在Js中\(zhòng)也是特殊字符所以需要轉(zhuǎn)義,第一個(gè)是正則表達(dá)式文本劣坊,第二個(gè)字符串是標(biāo)志位,g屈留,全局匹配*/
javascript中正則表達(dá)式對(duì)象的屬性
g:global 全局匹配局冰,不添加测蘑,匹配到第一個(gè)為止
i:ignore case 不分大小寫(xiě)
m: multiple lines 多行搜索,使^變?yōu)樾碌男惺?/p>
lastIndex:是當(dāng)前表達(dá)式匹配內(nèi)容的最后一個(gè)字符的下一個(gè)位置
source:正則表達(dá)式的文本字符串
javascript中正則對(duì)象本身的方法
RegExp.prototype.test(str)
作用:用于測(cè)試字符串參數(shù)中是否存在匹配正則表達(dá)式模式的字符串
符合返回true
,否則返回false
調(diào)用實(shí)例:
var reg = / \bis\b /g;
reg.test(str);
但當(dāng)使用全局g屬性標(biāo)識(shí)時(shí)康二,會(huì)修改lastIndex值碳胳,在匹配到最后一項(xiàng)之后會(huì)重置為0,因此會(huì)出現(xiàn)結(jié)果為反復(fù)的循環(huán)true沫勿、false挨约,出現(xiàn)結(jié)果不穩(wěn)定
其實(shí)test的本意,其實(shí)就是測(cè)試能否匹配上产雹。
RegExp.prototype.exec(str)
作用:使用正則表達(dá)式模式對(duì)字符串執(zhí)行搜索诫惭,并將更新全局RegExp對(duì)象的屬性以反映匹配結(jié)果。
如果沒(méi)有匹配到的文本則返回null蔓挖,否則返回一個(gè)結(jié)果數(shù)組夕土。
此數(shù)組有兩個(gè)屬性,
1.index:聲明匹配文本的第一個(gè)字符的位置
2.input:存放被檢索的字符串string
在非全局調(diào)用時(shí)瘟判,返回?cái)?shù)組:
第一個(gè)元素是與正則表達(dá)式相匹配的文本
第二個(gè)元素是與RegExpObject的第一個(gè)子表達(dá)式相匹配到的文本
第三個(gè)元素是與RegExpObject的第二個(gè)子表達(dá)式相匹配到的文本隘弊,以此類(lèi)推
javascript中字符串的方法
String.prototype.search(reg)
作用:用于檢索字符串中指定的子字符串,或檢索與正則表達(dá)式相匹配的子字符串荒适。
方法返回第一個(gè)匹配結(jié)果 index梨熙,查找不到返回-1
不執(zhí)行全局匹配,忽略g刀诬,總是從字符串的開(kāi)始進(jìn)行搜索咽扇。
String.prototype.match(reg)
作用:用于檢索字符串,以找到一個(gè)或多個(gè)與regxp匹配的文本
regxp是否具有標(biāo)志位g對(duì)結(jié)果影響很大
在非全局調(diào)用時(shí)陕壹,返回?cái)?shù)組质欲,沒(méi)有匹配到的文本則返回null
返回?cái)?shù)組第一個(gè)元素存放的是匹配文本,而其余的元素存放的是與正則表達(dá)式的子表達(dá)式匹配的文本
除了常規(guī)的數(shù)組元素之外糠馆,返回的數(shù)組還含有2個(gè)對(duì)象屬性
1.index:聲明匹配文本的第一個(gè)字符的位置
2.input:聲明對(duì)stringObject的引用
而在全局調(diào)用時(shí)嘶伟,返回的數(shù)組存放的是字符串中所有的匹配子串,而且也沒(méi)有index和input屬性又碌,就告訴你匹配結(jié)果九昧。
String.prototype.split(reg)
作用:我們經(jīng)常用split來(lái)把字符串分割為字符數(shù)組,而在一些復(fù)雜的情況下我們可以用正則表達(dá)式來(lái)分割毕匀。
String.prototype.replace(reg)
作用:替換內(nèi)容,三種方法铸鹰。
replace(str,replaceStr)
replace(reg,replaceStr)
replace(reg,function) 如將a1b2c3替換為a2b3c4
function(match,group,index,origin)參數(shù)含義
function會(huì)在每次匹配替換時(shí)調(diào)用,有4個(gè)參數(shù)
1.匹配字符串
2.正則表達(dá)式分組內(nèi)容皂岔,沒(méi)有分組則沒(méi)有參數(shù)
3.匹配項(xiàng)在字符串中的index
4.原字符串
正則表達(dá)式測(cè)試工具:https://regexper.com