前言
在H5開發(fā)中晨缴,正則表達(dá)式有很多地方都用得到讨越,固整理了正則表達(dá)式的基本規(guī)則,和在JS中如何使用正則表達(dá)式裤纹,做了簡單的介紹委刘。
1、正則常用字符
- ^:匹配輸入字符串的開始位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性锡移,^ 也匹配 'n' 或 'r' 之后的位置呕童。
- $:匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對象的 Multiline 屬性淆珊,$ 也匹配 'n' 或 'r' 之前的位置夺饲。
- (?=x): 表示位于字符前是否是x。例如施符,'hello'.replace(/(?=l)/,'#') 得到 'he#l#lo'
- (?!=x): 表示位于字符前為非x往声。 例如,'hello'.replace(/(?=l)/,'#') 得到 '#h#ell#o'操刀。
- {n}:n 是一個非負(fù)整數(shù)烁挟。匹配確定的 n 次。例如骨坑,'o{2}' 不能匹配 "Bob" 中的 'o'撼嗓,但是能匹配 "food" 中的兩個 o。
- {n,}:n 是一個非負(fù)整數(shù)欢唾。至少匹配n 次且警。例如,'o{2,}' 不能匹配 "Bob" 中的 'o'礁遣,但能匹配 "foooood" 中的所有 o斑芜。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'祟霍。
- {n,m}:m 和 n 均為非負(fù)整數(shù)杏头,其中n <= m。最少匹配 n 次且最多匹配 m 次沸呐。例如醇王,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'崭添。請注意在逗號和兩個數(shù)之間不能有空格寓娩。
- *:匹配前面的子表達(dá)式零次或多次。例如呼渣,zo 能匹配 "z" 以及 "zoo"棘伴。 等價于{0,}。
- +:匹配前面的子表達(dá)式一次或多次屁置。例如焊夸,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"缰犁。+ 等價于 {1,}淳地。
- ?:匹配前面的子表達(dá)式零次或一次怖糊。例如帅容,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 颇象。? 等價于 {0,1}。<u>當(dāng)該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時并徘,匹配模式是惰性匹配遣钳。惰性匹配盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串麦乞。例如蕴茴,對于字符串 "oooo",'o+?' 將匹配單個 "o"姐直,而 'o+' 將匹配所有 'o'倦淀。</u>
- .:就是[^\n\r\u2028\u2029]。通配符声畏,表示幾乎任意字符撞叽。換行符、回車符插龄、行分隔符和段分隔符除外愿棋。記憶方式:想想省略號...中的每個點(diǎn),都可以理解成占位符均牢,表示任何類似的東西糠雨。
- x|y:匹配 x 或 y。例如徘跪,'z|food' 能匹配 "z" 或 "food"甘邀。'(z|f)ood' 則匹配 "zood" 或 "food"。
- [xyz]:字符集合垮庐。匹配所包含的任意一個字符松邪。例如, '[abc]' 可以匹配 "plain" 中的 'a'突硝。
- [^xyz]:負(fù)值字符集合测摔。匹配未包含的任意字符。例如解恰, /[^abc]/ 可以匹配 'd' 不能匹配 'a'锋八。
- [a-z]:字符范圍。匹配指定范圍內(nèi)的任意字符护盈。例如挟纱,'[a-z]' 可以匹配 'a' 到 'z' 范圍內(nèi)的任意小寫字母字符。
下列特殊字符大小寫為取反來理解
- \b:匹配一個單詞邊界腐宋,也就是指單詞和空格間的位置紊服。例如檀轨, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'欺嗤。
- \B:匹配非單詞邊界参萄。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'煎饼。
- \d: 匹配一個數(shù)字字符讹挎。等價于 [0-9]。
- \D: 匹配一個非數(shù)字字符吆玖,等價于 [^0-9]
- \w: 匹配包括下劃線的任何單詞字符筒溃。等價于'[A-Za-z0-9_]'
- \W: 匹配除了\w所包含的字符
- \s: 匹配任何空白字符,包括空格沾乘、制表符怜奖、換頁符等等
- \S: 匹配除了\s所匹配的字符
特殊字符
- \f: 匹配一個換頁符。等價于 x0c 和 cL翅阵。
- \n: 匹配一個換行符歪玲。等價于 x0a 和 cJ。
- \r: 匹配一個回車符怎顾。等價于 x0d 和 cM读慎。
- \t: 匹配一個制表符。等價于 x09 和 cI槐雾。
- \v: 匹配一個垂直制表符夭委。等價于 x0b 和 cK。
- \cx:匹配由 x 指明的控制字符募强。例如株灸, cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一擎值。否則慌烧,將 c 視為一個原義的 'c' 字符。
2鸠儿、js正則表達(dá)式運(yùn)用
1.修飾符
- /g: 全局匹配屹蚊,不會匹配一個后就停止
- /i: 忽略大小寫匹配
- /m: 支持多行匹配
- /u: Unicode模式(ES6),也可以這樣使用/\u{65}/標(biāo)明大括號里面是unicode
2.常用api
- js用RegExp表示正則表達(dá)式进每,創(chuàng)建RegExp如下
//直接創(chuàng)建對象,/^h/里面為正則式 g為修飾符
let reg = /^h/g
//使用構(gòu)造函數(shù)創(chuàng)建, 第一個參為為正則式汹粤,第二個參數(shù)為修飾符
let reg = new RegExp('xyz', 'i')
//或者,等同上
let reg = new RegExp(/xyz/i)
- RegExp 方法
- test()用于檢測一個字符串是否匹配某個模式.如果字符串 string 中含有與 RegExpObject 匹配的文本田晚,則返回 true嘱兼,否則返回 false
let reg = /\d/g
reg.test('11234') //true
reg.test('adfd') //false
- exec() 如果exec()找到了匹配的文本,則返回一個結(jié)果數(shù)組贤徒。否則芹壕,返回 null汇四。此數(shù)組的第 0 個元素是與正則表達(dá)式相匹配的文本,第 1 個元素是與 RegExpObject 的第 1 個子表達(dá)式相匹配的文本(如果有的話)踢涌,第 2 個元素是與 RegExpObject 的第 2 個子表達(dá)式相匹配的文本(如果有的話)通孽,以此類推。除了數(shù)組元素和 length 屬性之外斯嚎,exec() 方法還返回兩個屬性利虫。index 屬性聲明的是匹配文本的第一個字符的位置挨厚。input 屬性則存放的是被檢索的字符串 string.
eg:非全局正則表達(dá)式
let reg = /En(glish)/
let ret = reg.exec('Speak English')
//ret[0] -> English
//ret[1] -> En
//ret.index -> 6
//input: "speak English"
console.log(ret)
當(dāng) RegExpObject 是一個全局正則表達(dá)式時堡僻,exec() 的行為就稍微復(fù)雜一些。它會在RegExpObject的 lastIndex屬性指定的字符處開始檢索字符串 string疫剃。當(dāng) exec()找到了與表達(dá)式相匹配的文本時钉疫,在匹配后,它將把 RegExpObject 的 lastIndex 屬性設(shè)置為匹配文本的最后一個字符的下一個位置巢价。這就是說牲阁,您可以通過反復(fù)調(diào)用 exec() 方法來遍歷字符串中的所有匹配文本。當(dāng)exec() 再也找不到匹配的文本時壤躲,它將返回null城菊,并把lastIndex 屬性重置為 0。
eg:全局正則表達(dá)式
let reg = /e/gi
let ret = null
while (ret = reg.exec('speak English')) {
console.log(ret[0])
console.log('lastIndex:' +reg.lastIndex)
}
//ret[0] -> e ret.index -> 2 reg.lastIndex -> 3
//ret[0] -> E ret.index -> 6 reg.lastIndex -> 7
- string類型正則相關(guān)方法
- search(regexp)中第一個與 regexp 相匹配的子串的起始位置碉克,如果沒有找到則返回-1凌唬。該方法不執(zhí)行全局匹配,它將忽略標(biāo)志g漏麦。它同時忽略 regexp 的 lastIndex 屬性客税,并且總是從字符串的開始進(jìn)行檢索,這意味著它總是返回 string 的第一個匹配的位置撕贞。
let ret = 'hello Jack'.search(/h/g) //返回2更耻,g修飾符被忽略
let ret1 = 'hello Jack'.search(/b/g) //返回-1
- match(regexp) 匹配機(jī)制總體和exec()是相似的。
如果 regexp 沒有標(biāo)志 g捏膨,那么 match() 方法就只能在 stringObject 中執(zhí)行一次匹配秧均。如果沒有找到任何匹配的文本, match() 將返回 null号涯。否則目胡,它將返回一個數(shù)組,其中存放了與它找到的匹配文本有關(guān)的信息诚隙。該數(shù)組的第 0 個元素存放的是匹配文本讶隐,而其余的元素存放的是與正則表達(dá)式的子表達(dá)式匹配的文本。除了這些常規(guī)的數(shù)組元素之外久又,返回的數(shù)組還含有兩個對象屬性巫延。index 屬性聲明的是匹配文本的起始字符在 stringObject 中的位置效五,input 屬性聲明的是對 stringObject 的引用。
如果 regexp 具有標(biāo)志 g炉峰,則 match() 方法將執(zhí)行全局檢索畏妖,找到 stringObject 中的所有匹配子字符串。若沒有找到任何匹配的子串疼阔,則返回 null戒劫。如果找到了一個或多個匹配子串,則返回一個數(shù)組婆廊。不過全局匹配返回的數(shù)組的內(nèi)容與前者大不相同迅细,它的數(shù)組元素中存放的是 stringObject 中所有的匹配子串,而且也沒有 index 屬性或 input 屬性淘邻。
let ret = 'hello Jack, hello Rose'.match(/hello/) // hello
let ret1 = 'hello Jack, hello Rose'.match(/hello/g) //[hello,hello]
- replace(regexp,replacement)查找并替換的操作茵典。它將在 stringObject 中查找與 regexp 相匹配的子字符串,然后用 replacement 來替換這些子串宾舅。如果 regexp 具有全局標(biāo)志 g统阿,那么 replace() 方法將替換所有匹配的子串。否則筹我,它只替換第一個匹配子串扶平。
let ret = 'hello Jack, hello Rose'.replace(/hello/g,'Hi')
//Hi Jack, Hi Rose
let ret1 = 'hello Jack, hello Rose'.replace(/Jack/, 'Tom')
//hello Tom, hello Rose
- split(separator,howmany) separator可以是正則表達(dá)式或者字符串,howmany限定數(shù)組長度蔬蕊。
一個字符串?dāng)?shù)組结澄。該數(shù)組是通過在 separator 指定的邊界處將字符串 stringObject 分割成子串創(chuàng)建的。返回的數(shù)組中的字串不包括 separator 自身袁串。
但是概而,如果 separator 是包含子表達(dá)式的正則表達(dá)式,那么返回的數(shù)組中包括與這些子表達(dá)式匹配的字串(但不包括與整個正則表達(dá)式匹配的文本)囱修。
我們這里只討論使用正則表達(dá)式的情況:
let ret = 'hello Jack, hello Rose'.split(/hello/g)
//["", " Jack, ", " Rose"]
let ret1 = 'hello Jack, hello Rose'.split(/(hello)/)
//["", "hello", " Jack, ", "hello", " Rose"]
常用實(shí)例
- yyyy-MM-dd 時間格式校驗(yàn) : /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/
- 對數(shù)子進(jìn)行千分位逗號隔開(如:12345678 123456789 -> 12,345,678 123,456,789) : /\B(?=(\d{3})+\b)/g
- 國內(nèi)手機(jī)號碼校驗(yàn):/^1[3456789]\d{9}$/
- 大陸身份證號碼校驗(yàn):/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/
- 郵箱校驗(yàn): /^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$/
- http地址校驗(yàn): /^https?://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$/
結(jié)語
本篇主要針對正則基礎(chǔ)的闡述赎瑰,如果希望在熟練地應(yīng)用到開發(fā)中還需要多多練習(xí)。