JS基礎(chǔ)(五)---正則表達(dá)式

正則語法

正則表達(dá)式的創(chuàng)建方式

  • 使用正則表達(dá)式字面量启摄,用兩個/ 來表示 ,/正則表達(dá)式/
    var reg = /abc/

  • 使用RegExp對象的構(gòu)造函數(shù)瓣铣,new RegExp("正則表達(dá)式"哥遮,“imgs”)
    第一個參數(shù) 是 正則表達(dá)式 笨使, 第二個參數(shù) 是 后綴修飾符
    var reg= new RegExp("abc")

正則表達(dá)式的組成

由一些普通字符和一些特殊字符(又叫元字符--metacharacters)組成。普通字符包括大小寫的字母和數(shù)字竞阐,而元字符則具有特殊的含義提茁。

特殊字符:javascript 中常用特殊字符有 ( ) [ ] { } \ ^ $ | ? * .+

如果正則表達(dá)式中包含以上的特殊字符, 則需要使用 轉(zhuǎn)義符 \ 對其進(jìn)行轉(zhuǎn)義馁菜,如: \(茴扁,\^\\

預(yù)定義特殊字符:
\t 制表符
\n 回車符
\f 換頁符
\b 空格

正則表達(dá)式字符集

  • 最簡單的正則
    關(guān)鍵字原文
    /abc/ -----> 匹配的是 "abc"
備選字符集 ---[]

某一個可用的備選字符列表汪疮,使用[備選的字符列表]

var  str = "out ont o1t ";
console.log(str.match(/o[usb]t/g));   // ["out"]
  • 連續(xù)備選字符
    若備選的字符列表太多峭火,且類型相同,全部輸入太麻煩智嚷,可以在 中間加了個橫線 -卖丸,將字符連起來,如[a-z]盏道、[0-9]稍浆、[A-Z]、[0-9a-z]
var  str = "out ont o1t ";
console.log(str.match(/o[0-9a-z]t/g));   //  ["out", "ont", "o1t"]
  • 反向: [] 前面加個元字符進(jìn)行取反,表示匹配不能為括號里面的字符衅枫。[^0-9] --->除去0-9的關(guān)鍵字符
var  str = "out ont o1t ";
console.log(str.match(/o[^0-9]t/g));    // ["out", "ont"]

一個中括號嫁艇,只能匹配到一個字符

預(yù)定義備選字符集

\d ---------> [0-9]
\w ---------> [0-9a-zA-Z]
\s ---------> [ \t\n\x0B\f\r] 匹配所有的空字符,如:空格弦撩、制表符步咪、換行
. ---------> [^\n\r] 除了換行和回車 后的任意字符
\D ---------> [^0-9] 非數(shù)字字符
\W ---------> [^a-zA-Z_0-9] 非單詞字符
\S ---------> [^ \t\n\x0B\f\r] 非空白字符
[\u4e00-\u9fa5] -----> 中文字符集

量詞 ---{}

規(guī)定相鄰的前一個字符集出現(xiàn)的次數(shù)

寫法 含義
{n} 必須n次
{n,m} 至少出現(xiàn) n 次但不超過 m 次(中間不能有空格)
{n,} 至少出現(xiàn)n次(+的升級版)
? 出現(xiàn)零次或一次(最多一次)
* 出現(xiàn)零次或多次(任意次)
+ 出現(xiàn)一次或多次(至少一次)
分組 ---()

分組,在正則表達(dá)式中用()包裹起來的內(nèi)容代表一個分組

  • 分組的反向引用
  • 正則表達(dá)式中的每個()益楼,都是一個子表達(dá)式猾漫,每個子表達(dá)式都會自動獲得一個從 1 開始的編號
  • 在正則表達(dá)式內(nèi)部,可用 \編號 形式 來表示 分組中的第i個子表達(dá)式匹配到的內(nèi)容感凤,如 /(a)\1/ --> 表示匹配 字符為aa 的內(nèi)容
  • 而在正則表達(dá)式外悯周,可用n表示本次匹配中第n個子表達(dá)式所匹配到的對應(yīng)內(nèi)容,RegExp.n陪竿,常用于replace()方法中
$的表示方式
  • $i:(i取值范圍1~99)队橙,表示從左到右正則子表達(dá)式所匹配的內(nèi)容
  • $&:表示與正則表達(dá)式匹配的全部內(nèi)容
  • $`: ($ + `,反引號):表示匹配字符串的左邊內(nèi)容
  • $':($ + ' 單引號)萨惑,表示匹配字符串的右邊內(nèi)容
var date = "20201225一下065959";
var reg = /(\d{4})(\d{2})(\d{2})([\u4e00-\u9fa5])([\u4e00-\u9fa5])(\d{2})(\d{2})(\d{2})/;
//               2020    12      25             一                       下               06      59      59
//                $1    $2        $3            $4                       $5                 $6      $7    $8 
date = date.replace(reg, "$1年$2月$3日 星期$4 $5午 $6:$7:$8")捐康;
console.log(date)

var dateStr = '2020-12-25';
var reg = /(\d{4})-(\d{2})-(\d{2})/;
console.log(reg.test(dateStr)); //true
console.log(RegExp.$1) //2020
console.log(RegExp.$2) //12
console.log(RegExp.$3) //25
選擇 ---|

字符 | 用于分隔供選擇的字符,可理解為 “或”庸蔼,表示在多個選擇項中選擇一個解总,在正則的優(yōu)先級中非常低

  • 匹配選擇的規(guī)則

選擇項是從左到右考慮,直到發(fā)現(xiàn)了匹配項姐仅。如果左邊的選擇項匹配花枫,則忽略右邊的匹配項,即使它產(chǎn)生更好的匹配掏膏。

邊界 --- ^$
  • ^ 匹配開始位置 (注意與[^]區(qū)分開)
    表示限制開頭劳翰,后面的正則內(nèi)容匹配的結(jié)果必須出現(xiàn)在字符串開始

  • $ 匹配結(jié)束位置
    表示限制結(jié)尾,前面的正則內(nèi)容匹配的結(jié)果必須出現(xiàn)在字符串結(jié)尾

  • 前加^后加$ 馒疹,且中間沒有 |, 表示同時限制開頭和結(jié)尾佳簸,中間的字符必須與正則表達(dá)式完全匹配

  • \b: 表示單詞的邊界 如: \bno\b 只匹配單詞no,如果匹配獨立的單詞颖变,則兩邊同時加 \b

正則表達(dá)式 后綴修飾符

g --->(global) 修飾符用于執(zhí)行全局匹配(查找所有匹配而非在找到第一個匹配后停止)
i --->(ignore case)修飾符用于執(zhí)行對大小寫不敏感的匹配
m --->(multiline)修飾符用于多行模式執(zhí)行的匹配(若正則表達(dá)式?jīng)]有^$匹配字符串的開頭或結(jié)尾生均,那么/m修飾符沒有任何意義)
s ---> (singleline),dotAll標(biāo)志腥刹,匹配任意字符马胧,包括換行,解決.匹配的缺點(除了換行和回車 后的任意字符),與m不同衔峰,m只影響^$佩脊,而s只影響.

相關(guān)的正則方法

字符串的方法

split()

根據(jù)匹配字符串切割父字符串

// 通過空格字符串進(jìn)行分割
var str = "aa bbb    c dd eeeeee";
console.log(str.split(/\s+/));       // ["aa", "bbb", "c", "dd", "eeeeee"]
search()

對正則表達(dá)式或指定字符串進(jìn)行搜索蛙粘,返回第一個出現(xiàn)的匹配項的下標(biāo)。如果未找到威彰,則返回 -1

// 查詢子串在父字符串中出現(xiàn)的位置
var str = "abcdefg";
console.log(str.search(/cd/));  //  2
console.log(str.search(/cdf/));  //  -1
match()

使用正則表達(dá)式與字符串相比較出牧,返回一個包含匹配結(jié)果的數(shù)組
默認(rèn)是只返回第一個找到的關(guān)鍵詞就結(jié)束
在正則表達(dá)式后 加上后綴 g,能夠匹配到所有關(guān)鍵詞的 數(shù)組
如果未找到抱冷,則返回null

在使用此方法時崔列,需要先判斷匹配的結(jié)果kwords是否為 null梢褐,再對結(jié)果進(jìn)行使用數(shù)組的相關(guān)方法旺遮,如 kwords.length

// 在父字符串中去匹配符合的子字符串
var str = "abbcccbbbbbddbbbdabbb";
console.log(str.match(/b+/));  // ["bb"]
console.log(str.match(/b+/g));  // ["bb", "bbbbb", "bbb", "bbb"]
replace()

用正則表達(dá)式和字符串直接比較,然后用新的子串來替換被匹配的子串
默認(rèn)匹配第一個符合的子串 就結(jié)束
匹配所有符合的關(guān)鍵詞盈咳,需要加 后綴 g

// 替換字符串的指定部分耿眉,返回值是一個新的替換后的字符串
var str = "aa abb acc add";
console.log(str.replace(/a+/,"A"));  //  "A abb acc add"
console.log(str.replace(/a+/g,"A")); // "A Abb Acc Add"

RegExp對象的方法

exec()

查找匹配的字符串,輸出到數(shù)組中鱼响,既獲得每個關(guān)鍵字的內(nèi)容鸣剪,又獲得每個關(guān)鍵字的位置,但只會在找到第一個之后直接中止丈积。
形如: var arr = reg.exec(str)筐骇;,表示從str中查找符合reg要求的關(guān)鍵詞的位置和內(nèi)容江滨,并保存在數(shù)組arr中

特點

  • 返回的結(jié)果為數(shù)組铛纬,每次只返回一個關(guān)鍵字的內(nèi)容,新的關(guān)鍵字替換上一個唬滑,保存在arr[0]中告唆,如果找不到,則返回null
  • 將本次找到的關(guān)鍵字的位置保存在arr.index中
  • 自動調(diào)整晶密,reg.lastIndex屬性為下次開始的查找位置(默認(rèn)從0開始)擒悬,因此每個關(guān)鍵字都是arr[0],因為會被替換

因此稻艰,根據(jù)以上exec()存在的特點懂牧,可以通過 循環(huán)遍歷使用該方法來獲取所有符合關(guān)鍵字的內(nèi)容(需要加后綴修飾符 g

test()

檢測字符串中是否滿足正則表達(dá)式的匹配規(guī)則,返回值是布爾值
形如:reg.test(str)尊勿;归苍,如果str符合reg的要求,則返回 true运怖,表示驗證通過拼弃,否則為false,驗證失敗

一般在做驗證中摇展,會配合^$一起使用吻氧,否則會出現(xiàn) 局部匹配 就驗證通過的情況

深入學(xué)習(xí)正則表達(dá)式,推薦看這本書《JavaScript 正則迷你書》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盯孙,隨后出現(xiàn)的幾起案子鲁森,更是在濱河造成了極大的恐慌,老刑警劉巖振惰,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歌溉,死亡現(xiàn)場離奇詭異,居然都是意外死亡骑晶,警方通過查閱死者的電腦和手機痛垛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桶蛔,“玉大人匙头,你說我怎么就攤上這事∽欣祝” “怎么了蹂析?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碟婆。 經(jīng)常有香客問我电抚,道長,這世上最難降的妖魔是什么竖共? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任蝙叛,我火速辦了婚禮,結(jié)果婚禮上肘迎,老公的妹妹穿的比我還像新娘甥温。我一直安慰自己,他們只是感情好妓布,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布姻蚓。 她就那樣靜靜地躺著,像睡著了一般匣沼。 火紅的嫁衣襯著肌膚如雪狰挡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天释涛,我揣著相機與錄音加叁,去河邊找鬼。 笑死唇撬,一個胖子當(dāng)著我的面吹牛它匕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窖认,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼豫柬,長吁一口氣:“原來是場噩夢啊……” “哼告希!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烧给,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤燕偶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后础嫡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體指么,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年榴鼎,在試婚紗的時候發(fā)現(xiàn)自己被綠了伯诬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡檬贰,死狀恐怖姑廉,靈堂內(nèi)的尸體忽然破棺而出缺亮,到底是詐尸還是另有隱情翁涤,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布萌踱,位于F島的核電站葵礼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏并鸵。R本人自食惡果不足惜鸳粉,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望园担。 院中可真熱鬧届谈,春花似錦、人聲如沸弯汰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咏闪。三九已至曙搬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸽嫂,已是汗流浹背纵装。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留据某,地道東北人橡娄。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像癣籽,于是被迫代替她去往敵國和親挽唉。 傳聞我的和親對象是個殘疾皇子扳还,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

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