JS正則表達(dá)式詳解

前言

在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 方法
  1. test()用于檢測一個字符串是否匹配某個模式.如果字符串 string 中含有與 RegExpObject 匹配的文本田晚,則返回 true嘱兼,否則返回 false
let reg = /\d/g
reg.test('11234') //true
reg.test('adfd') //false
  1. 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)方法
  1. 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
  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] 
  1. 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
  1. 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í)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末破镰,一起剝皮案震驚了整個濱河市餐曼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲜漩,老刑警劉巖源譬,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孕似,居然都是意外死亡踩娘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門喉祭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來养渴,“玉大人雷绢,你說我怎么就攤上這事±肀埃” “怎么了翘紊?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藐唠。 經(jīng)常有香客問我帆疟,道長,這世上最難降的妖魔是什么宇立? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任踪宠,我火速辦了婚禮,結(jié)果婚禮上泄伪,老公的妹妹穿的比我還像新娘殴蓬。我一直安慰自己,他們只是感情好蟋滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痘绎,像睡著了一般津函。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孤页,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天尔苦,我揣著相機(jī)與錄音,去河邊找鬼行施。 笑死允坚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛾号。 我是一名探鬼主播稠项,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲜结!你這毒婦竟也來了展运?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤精刷,失蹤者是張志新(化名)和其女友劉穎拗胜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怒允,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂软,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纫事。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勘畔。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡迷殿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咖杂,到底是詐尸還是另有隱情庆寺,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布诉字,位于F島的核電站懦尝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壤圃。R本人自食惡果不足惜陵霉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伍绳。 院中可真熱鬧踊挠,春花似錦、人聲如沸冲杀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽权谁。三九已至剩檀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旺芽,已是汗流浹背沪猴。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留采章,地道東北人运嗜。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像悯舟,于是被迫代替她去往敵國和親担租。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • RegExp對象實(shí)例化 RegExp是JS的正則表達(dá)式對象图谷,實(shí)例化一個RegExp對象有字面量和構(gòu)造函數(shù)2種方式翩活。...
    octcms閱讀 1,998評論 0 3
  • JavaScript-正則表達(dá)式 記錄這篇高大上的正則表達(dá)式,其實(shí)接觸很多便贵,但是實(shí)際項(xiàng)目里面感覺運(yùn)用的比較少呀菠镇,用...
    明明三省閱讀 3,028評論 0 24
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,216評論 0 4
  • 幾個正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
  • 前言 對于正則,著稱火星文字,見名知意主要它晦澀難懂,一直以來,看到它總是怕怕的,在平時,也只是簡單的用用,其主要...
    itclanCoder閱讀 760評論 0 2