正則表達(dá)式

. 匹配任意字符
正則表示的是一個(gè)組合,配合任意一個(gè)非斷行字符
.轉(zhuǎn)義
\w 表示文字和大小寫字母_
\W 表示\w的反向匹配字符
\d 表示匹配阿拉伯?dāng)?shù)字
\D 匹配非數(shù)字
\s 空格,tab,換行
\S 非
[] 匹配[]中的任意一個(gè)值,也可以是范圍,如果想匹配中文,可以使用中文的unicode
\u4e00-\u9fa5,\u表示是萬(wàn)國(guó)碼unicode,4e00和9fa5表示中文文字之間的范圍,給定的是一個(gè)unicode范圍,[ab]a或者b
+表示前面的字符可以出現(xiàn)一次或者多次
[ab][cd]+表示方括號(hào)的唯一值可以出現(xiàn)一次或多次,a或者b表示唯一的值
.在括號(hào)中要轉(zhuǎn)義

  • 表示0次或者多次
    ?表示0次或者1次
    {} 表示匹配字符的重新字?jǐn)?shù)
    分組匹配
    使用()進(jìn)行分組 1 表示第一組2 表示第二組
    貪婪,盡可能的多
    a.b aabaaab => aabaaab 默認(rèn)是貪婪模式,.會(huì)盡可能多的去匹配組,盡可能多的去匹配。
    a.
    ?b aabaaaab => aab 盡可能少的去匹配,盡可能少的去匹配
    在匹配次數(shù)后面加問(wèn)號(hào),表示懶惰 *?重復(fù)任意次,盡可能少的重復(fù)。+?重復(fù)一次或更多次,盡可能少的重復(fù)。??重復(fù)0或者1次,但盡可能少的重復(fù)。
    位置符
    ^ $ ?=x \b \B
    12332132 => 12.332.132

首先我們需要在兩個(gè)位置中插入兩個(gè)點(diǎn),所以需要找出這兩個(gè)位置,位置都出現(xiàn)在了三個(gè)數(shù)字的前面,并且還需要從后往前匹配,所以需要匹配行尾部
/(?=\d{3})+/g \B就是\b的反面,\b是\w與\W之間的位置,具體來(lái)說(shuō)就是\w \w \W \W \W ^之間的位置,位置和元素之間也可以匹配位置。
(?=p) 其中p是一個(gè)子模式,即p前面的位置
(?!p) 不是p前面的位置

位置的特性

對(duì)于位置的理解,我們可以理解成空字符

  • 不匹配任何東西的字符
    /.^/ 開頭的位置前面是沒(méi)有字符的
  1. 弄出最后一個(gè)分號(hào)12131232
    (?=\d{3}) 匹配的是\d{3}前面的位置,\d{3}則表示正則的最后三位
    弄出所有的逗號(hào)
    (?=(\d{3})+) , 因?yàn)槎禾?hào)出現(xiàn)的位置,要求后面3,6,9,12數(shù)字的前面出現(xiàn),一旦出現(xiàn)3的倍數(shù)就進(jìn)行替換 字符串首位不能出現(xiàn),(?!^)(?=(\d{3})+)
    (?!\b)(?=(\d{3})\b)
    格式化
    把字符串1888 => 1,888.00 function format(num) { return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ',').replace(/^/, ' ');
    }
    驗(yàn)證密碼的問(wèn)題
    是否包含某種字符
    判斷是否包含數(shù)字,將字符串中的所有位置找出來(lái)(?=.\d)判斷這個(gè)位置的后一個(gè)字符是否是數(shù)字,如果存在這樣的匹配,那么說(shuō)明字符串中有數(shù)字
    位置匹配的字符串往往放在字符串的最前面
    (?=.
    \d)(?=.[a-z])
    (?=.
    [0-9])^,表示開頭前面還有個(gè)位置

  2. 正則表達(dá)式括號(hào)的作用
    括號(hào)提供了分組,便于我們引用它。
    引用包括兩種情形,一種在js里引用,另一種在正則里引用

分組與分支結(jié)構(gòu)

  • 分組
    比如(ab)+()括號(hào)提供分組,使得+量詞作用于()內(nèi)部的整體,即提供子表達(dá)式。
    |分支往往要搭配分組括號(hào)使用

  • 分組引用
    正則引擎在匹配的過(guò)程中,會(huì)給每一個(gè)分組開辟一個(gè)空間,用來(lái)存儲(chǔ)每個(gè)分組的數(shù)據(jù)。
    match返回一個(gè)數(shù)組,第一個(gè)元素是整體匹配結(jié)果,然后是各個(gè)分組匹配的內(nèi)容,然后是匹配下標(biāo),是否有修飾符g,match返回的結(jié)果也不一樣

同時(shí)也可以通過(guò)正則構(gòu)造函數(shù)的全局屬性來(lái)獲取分組
只要執(zhí)行正則操作即可,比如test,exec,match
RegExp.1 RegExp.2

let regex = /(\d{4})-(\d{2})-(\d{2})/
let string = '2019-08-09'
string.replace(regex, '$1/$2/$3')
== 
string.replace(regex, () => RegExp.$1 + '/' + RegExp.$2 + '/' + RegExp.$3)
string.replace(regex, (match, year, month, day) => )
正則被執(zhí)行后會(huì)保存分組,分組通過(guò)全局的正則函數(shù)RegExp訪問(wèn),
replace的第二個(gè)參數(shù)可以是回調(diào)函數(shù),回調(diào)函數(shù)的第一個(gè)參數(shù)是正則匹配到的值,后面的參數(shù)是分組
  • 反向引用
    除了使用相應(yīng)的api引用分組,也可以在正則本身里引用分組。但是只能引用之前出現(xiàn)的分組。既反向引用。
    /\d{4}(-|/|.)\d{2}(-|/|.)\d{2}/
    /\d{4}(-|/|.)\d{2}\1\d{2}/
    \1 \2 在正則里分別代表第一個(gè)和第二個(gè)分組
    分組會(huì)將匹配到的內(nèi)容提取出來(lái),保存到內(nèi)存中

1.如果引用了不存在的分組,就會(huì)反向匹配引用字符本身

  1. 如果分組后面有量詞,那么最終捕獲到的數(shù)據(jù)是最后一次的匹配
    之前文中出現(xiàn)的括號(hào),都會(huì)捕獲他們匹配到的數(shù)據(jù),以便后續(xù)引用,因此也稱捕獲行分組,如果只是使用括號(hào)里最原始的功能,(?:xxx)
    字符串trim方法模擬
    /^\s|\s$/g 去掉首尾空格
    將每個(gè)單詞的首字母轉(zhuǎn)換為大寫
    string.replace(/(\s|^)\w/g, (value) => value.toUpperCase())
    駝峰轉(zhuǎn)換
    string.replace(/-(\w)/g, (value, group1) => group1.toupperCase())
    html轉(zhuǎn)義
const escapeHTML = (str) => {
      const escapeChars = {
        '<': 'a'
      }
      return str.replace(new RegExp('[' + Object.keys(escapeChars).join('') + ']')
        (value) => escapeChars[value]
      )
}

/<([a-z]+)>.+</\1>/g

正則表達(dá)式的回溯法原理

內(nèi)容:

  1. 沒(méi)有回溯的匹配
  2. 有回溯的匹配
  3. 常見(jiàn)的回溯形式

回溯法也稱試探法,從問(wèn)題的某一種狀態(tài)出發(fā),探索從這種狀態(tài)出發(fā)所能達(dá)到的所有狀態(tài),當(dāng)一條路走到盡頭的時(shí)候,再后退一步或者若干步,從另一種可能的狀態(tài)出發(fā),繼續(xù)搜索,直到所有的可能都被探索過(guò)。這種不斷前進(jìn)不斷回溯的方法就叫回溯法。本質(zhì)上就是深度優(yōu)先搜索算法,其中退到之前某一步的過(guò)程,我們稱為回溯

  • 貪婪量詞
    比如b{1, 3}因?yàn)槠涫秦澙返?,嘗試可能的順序是從多往少的方向去嘗試,首先嘗試bbb,然后看整個(gè)正則能否匹配,不能匹配時(shí),吐出一個(gè)b,再繼續(xù)嘗試,往復(fù)循環(huán),直到滿足要求。

  • 惰性量詞
    惰性量詞就是在貪婪量詞后面加一個(gè)?

  • 分支結(jié)構(gòu)
    分支結(jié)構(gòu)也是惰性的,比如/can|candy/,得到的結(jié)果是can,因?yàn)榉种?huì)一個(gè)一個(gè)嘗試,如果滿足了就不會(huì)在嘗試后面的分支。
    非捕獲分組?
    當(dāng)嘗試匹配時(shí),需要確定從哪一個(gè)位置開始匹配,一般都是從字符串的開頭
    當(dāng)使用test和exec方法,且正則有g(shù)時(shí),起始位置是從正則實(shí)例的lastIndex位置開始。

優(yōu)化正則性能

  1. 通過(guò)使用非捕獲型分組提升性能
  2. 獨(dú)立出確定字符
  3. 提取分支公共部分
  4. 減少分支的數(shù)量,縮小它們的范圍

正則表達(dá)式的四種操作

  1. 驗(yàn)證
    match返回結(jié)果的格式問(wèn)題,分為是否有g(shù)兩種情況
    沒(méi)有g(shù) => [ 匹配的值,分組匹配的值,匹配開始的位置,需要匹配的字符串 ]
    有g(shù) => 返回的是所有匹配的內(nèi)容
    當(dāng)沒(méi)有匹配時(shí),不管有無(wú)g,都返回null
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 正則表達(dá)式是匹配模式,匹配字符或者匹配位置。 一、字符匹配 1.兩種模糊匹配 1.1 橫向模糊匹配 一個(gè)正則可匹配...
    菜菜的小阿允閱讀 1,733評(píng)論 0 0
  • NSRegularExpression 正則表達(dá)式,又稱正規(guī)表示法、常規(guī)表示法。(英語(yǔ):Regular Expre...
    SunshineBrother閱讀 7,760評(píng)論 3 25
  • 正則表達(dá)式有很多流派,也有很多的特性,不同的語(yǔ)言支持度也是不一樣的。本篇文章是寫Python中的正則表達(dá)式的用法的...
    Moscow1147閱讀 1,207評(píng)論 0 0
  • 注:本篇文章只為方便查看,特此保留,如有冒犯,敬請(qǐng)諒解?。?! 本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達(dá)式是什么,并對(duì)它...
    阿杰Alex閱讀 1,565評(píng)論 0 10
  • 人的一生,活法各異。沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),條條大路通羅馬,最終是赤條條的來(lái),光溜溜的去。 但人是群居動(dòng)物,會(huì)思維,善模仿...
    秦巴漢275e5477c13f閱讀 1,234評(píng)論 13 14

友情鏈接更多精彩內(nèi)容