注意:
- 匹配了的項不會再匹配了
- 空格也參與匹配
- 如果加了^和$則是匹配字符串從而得出true or false(對給定的字符串只匹配一次)
-
什么是正則表達式
正則表達式是由一個字符序列形成的搜索模式腕巡。
當(dāng)你在文本中搜索數(shù)據(jù)時,你可以用搜索模式來描述你要查詢的內(nèi)容。
正則表達式可以是一個簡單的字符,或一個更復(fù)雜的模式。
正則表達式可用于所有文本搜索(search方法)和文本替換(replace方法)的操作。
語法
/ 正則表達式主體 / 修飾符(可選)
修飾符:
i 不區(qū)分(ignore)大小寫
例如: /abc/i 可以匹配 abc、aBC蜈亩、Abc
g 全局(global)匹配
如果不帶g,正則過程中字符串從左到右匹配前翎,找到第一個符合條件的即匹配成功稚配,返回
如果帶g,則字符串從左到右港华,找到每個符合條件的都記錄下來道川,直到字符串結(jié)尾位置
例如:
var str = 'aaaaaaaa'
var reg1 = /a/; str.match(reg1) // 結(jié)果為:["a", index: 0, input: "aaaaaaaa"]
var reg2 = /a/g; str.match(reg2) // 結(jié)果為:["a", "a", "a", "a", "a", "a", "a", "a"]
m 多(more)行匹配
若存在換行\(zhòng)n并且有開始^或結(jié)束 (美元符) 符的情況下,和 g一起使用實現(xiàn)全局匹配,
因為存在換行時默認(rèn)會把換行符作為一個字符任務(wù)匹配字符串是個單行,
g只匹配第一行愤惰,添加m之后實現(xiàn)多行苇经,每個換行符之后就是開始
var str = "abcggab\nabcoab";
var preg1 = /^abc/gm; str.match(preg1) // 結(jié)果為:["abc", "abc"]
var preg2 = /ab$/gm; str.match(preg2) // 結(jié)果為:["ab", "ab"]
s 特殊字符圓點 . 中包含換行符
默認(rèn)的圓點 . 是 匹配除換行符 \n 之外的任何單字符,加上s之后, . 中包含換行符
$ str = "abggab\nacbs";
$ preg = "/b./s";
preg_match_all($preg, $str,$matchs);
print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) )
U 只匹配最近的一個字符串;不重復(fù)匹配;
$mode="/a(.*?)c/";
$preg="/a.*c/U";//這兩個正則返回相同的值
$str="abcabbbcabbbbbc" ;
preg_match($mode,$str,$content); echo $content[0];//abc
preg_match($preg,$str,$content); echo $content[0];//abc
//修正符:x 將模式中的空白忽略;
//修正符:A 強制從目標(biāo)字符串開頭匹配;
//修正符:D 如果使用$限制結(jié)尾字符,則不允許結(jié)尾有換行;
//修正符:e 配合函數(shù)preg_replace()使用, 可以把匹配來的字符串當(dāng)作正則表達式執(zhí)行;
注意:上面主要使用search()方法和replace()方法宦言,也能用test()方法
search() 方法
用于檢索字符串中指定的子字符串扇单,或檢索與正則表達式相匹配的子字符串,并返回子串的起始位置奠旺。
var str = "Visit Runoob!";
var n = str.search("Runoob");
replace() 方法
用于在字符串中用一些字符替換另一些字符蜘澜,或替換一個與正則表達式匹配的子串。
str='Visit Microsoft'
str.replace(/microsoft/i,'Runoob') //使用Runoob 代替 str 中的Microsoft字符串</pre>
注意:下面的寫法 被稱為 正則表達式模式
使用方法有兩個:
-
test()
test() 方法用于檢測一個字符串是否匹配某個模式响疚,如果字符串中含有匹配的文本鄙信,則返回 true,否則返回 false忿晕。
const pat1=new RegExp('e') //是否有字母e
pat1.test('the best thing') //true
-
exec()
exec() 方法用于檢索字符串中的正則表達式的匹配装诡。
該函數(shù)返回一個數(shù)組,其中存放匹配的結(jié)果践盼。如果未找到匹配鸦采,則返回值為 null。
const pat1=new RegExp('e') //是否有字母e
pat1.exec('the best thing') //返回了 要找的內(nèi)容 e
-
正則表達式的元字符
注意: ^ 在 [ ] 中是取反的意思咕幻,在外面是匹配字符串的開始的意思
^.{2}$ 表示匹配兩個除了\以外字符組成的字符串
[^aeiou] 表示除了aeiou以外的字符
-
反義(將小寫變成大寫即可)
[ aeiou] ID 表示 可以是[ ]中的任意一個再加上 ID 組成的字符
3.轉(zhuǎn)義
問題: 如何匹配特殊字符呢 渔伯? 如 ‘ . ’ ,' ? '等
答:使用轉(zhuǎn)義符 【 \ 】,如 \ . , \ ?
-
正則表達式的注釋
5.正則表達式的重復(fù)
例如:
?表示 有沒有肄程,+ 表示要不要在加幾個 锣吼,* 表示任意個,沒有限制
zo* 表示可以匹配 z 或者 zoo
\ d{8} 表示 匹配 8位的數(shù)字
6.分支條件
例子
如 ^ 0\d{2,3}-\d{8} | 0\d{3}-d{7} $
021-1234567 true
023-12345678 true
023-123456789 false,后半段數(shù)字的長度只能是7或者8位蓝厌,其中 …^ 表示開始玄叠, $表示結(jié)尾
\d{2,6} 表示2到6位數(shù)字
7.分組:()
作用:將子表達式做成子集,方便對匹配的字符進行劃分
符號 :()
例子:
(\d{1,3} \ .){3}\d{1,3} 匹配IP地址
其中 \d {1,3} 表示 可以是 1-3個數(shù)字
8.貪婪和懶惰
-
貪婪 : .*
作用: 比如 <a.*> ,如果一個頁面中有多個< a>標(biāo)簽褂始,則會將第一個< a > 一直到最后一個< a> 看成是一個結(jié)果找出
理解:
' . ' 代表 匹配除了 換行符 以外的所有字符
‘ * ’ 代表 出現(xiàn)次數(shù)為 零次到無限次
‘ .* ' 表示 除了換行符的字符 出現(xiàn)零次到無限次
-
懶惰 :.*?
作用:比如 < a .*>,如果一個頁面中有多個 < a > 標(biāo)簽诸典,則會將每一個 < a>標(biāo)簽看成一個結(jié)果描函,如果有n個 崎苗,則會有n個結(jié)果
理解:
’ ?' 代表 出現(xiàn)零次或者一次(盡量匹配少的內(nèi)容舀寓,最簡短的那個)
例子:
當(dāng)正則表達式中包含能接受重復(fù)的限定符時胆数,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。以這個表達式為例:a.*b互墓,它將會匹配最長的以a開始必尼,以b結(jié)束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串a(chǎn)abab判莉。這被稱為貪婪匹配豆挽。
有時,我們更需要懶惰匹配券盅,也就是匹配盡可能少的字符帮哈。前面給出的限定符都可以被轉(zhuǎn)化為懶惰匹配模式,只要在它后面加上一個問號?锰镀。這樣.*?就意味著匹配任意數(shù)量的重復(fù)娘侍,但是在能使整個匹配成功的前提下使用最少的重復(fù)。現(xiàn)在看看懶惰版的例子吧:
a.*?b匹配最短的泳炉,以a開始憾筏,以b結(jié)束的字符串。如果把它應(yīng)用于aabab的話花鹅,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)