成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

正則表達(dá)式詳解

keelii / 928人閱讀

摘要:學(xué)習(xí)正則表達(dá)式也是如此,循序漸進(jìn),方能厚積薄發(fā)。概念分組捕獲是指將想要匹配的正則表達(dá)式用小括號(hào)括起來(lái),然后與限定符組合使用,可以連續(xù)匹配符合規(guī)則的字符串。

正則表達(dá)式是一個(gè)非常有用的用來(lái)匹配驗(yàn)證字符串的工具。很多人覺(jué)得正則表達(dá)式規(guī)則繁多,學(xué)了也會(huì)忘記,不如等到需要使用的時(shí)候再去查閱即可。這樣的觀點(diǎn)也無(wú)可厚非,不過(guò)我曾經(jīng)看到過(guò)一個(gè)絕妙的關(guān)于閱讀的比喻,閱讀就像是將竹簍浸入到水里面,雖然撈打上來(lái)的時(shí)候竹簍里并沒(méi)有裝水,但是竹簍已經(jīng)被浸濕了。學(xué)習(xí)正則表達(dá)式也是如此,循序漸進(jìn),方能厚積薄發(fā)。

大綱

◆ 常用的正則表達(dá)式

◆ 分組捕獲與后向引用

◆ 貪婪模式與非貪婪模式

◆ 應(yīng)用場(chǎng)景

常用的正則表達(dá)式 1.元字符
元字符 釋義
普通字符 如A-Z、a-z、0-9 等等
. 除換行以外的其他任意字符, 如果需要匹配換行符,可用[.n]
s 空白字符
S 除空白字符以外的任意字符
w 字母、數(shù)字、下劃線
W 除了字母、數(shù)字、下劃線以外的任意字符
d 數(shù)字 0-9
D 除了數(shù)字之外的任意字符
^ 匹配輸入字符串開始的位置
$ 匹配輸入字符串結(jié)尾的位置
b 單詞邊界,匹配一個(gè)完整的單詞可以使用 bwordb

以上是最常用的正則表達(dá)式匹配字符,當(dāng)然,還有很多其他的匹配元字符,比如 匹配制表符, 匹配回車符, 匹配換行符等。

d為例,d代表數(shù)字0-9,等價(jià)于字符組[0-9]

例:匹配字符串 ‘fefafe332gt66ooj44nie85kk’ 中的所有數(shù)字
var str = "fefafe332gt66ooj44nie85kk"
var reg = /d+/g
console.log(str.match(reg)) // 結(jié)果為["332", "66", "44", "85"]
2.限定符
限定符 釋義
* 0到無(wú)數(shù)次。例如,zo* 能匹配 "z" 以及 "zoo"
+ 1到無(wú)數(shù)次。例如,zo+ 不能匹配 “z” 但是能匹配 “zo”和“zoo”
? 0 或者1 次。例如,zo? 能匹配 “z”和 “zo” 但是不能匹配 “zoo”
{n} 匹配確定的N次。 例如, zo{2} 只能匹配到 zoo
{n,} 匹配n到無(wú)限次。 例如,zo{1,} 不能匹配“z” 但是能匹配“zo”和“zoo”
{n,m} 匹配n到m次。注意:在逗號(hào)和兩個(gè)數(shù)之間不能有空格

以上這些限定符,可以匹配指定個(gè)數(shù)的字符,在能夠匹配的范圍之內(nèi),盡可能多的匹配。其中{n,m}限定符有兩個(gè)注意點(diǎn):

n不能大于m

在逗號(hào)和兩個(gè)數(shù)之間不能有空格,否則無(wú)法匹配

例:匹配38到288之間的數(shù)
let reg = /((38|39)|([4-9]d)|(1d{2})|(2[0-7]d)|(28[0-8]))/g
let str = "45 454 255 288 38 88 11 37 100 109 28 000 289 209"
console.log(str.match(reg)) // ["45", "255", "288", "38", "88", "100", "109", "209"]
3.修飾符
修飾符 釋義
g global 全局搜索 (不添加 搜索到第一個(gè)匹配停止)
i ignore case 忽略大小寫
m multiline 多行匹配

m多行匹配用得相對(duì)較少,但是也有一定用處。

例:對(duì)比m和mg
var str8 = "abeifenabc
abpheeabc" 
var reg8a = /^ab/gm
var reg8b = /^ab/g
console.log(str8.match("gm:"+reg8a)) // 結(jié)果為:["ab", "ab"]
console.log(str8.match("g:"+reg8b)) // 結(jié)果為:["ab"]

上面三個(gè)修飾符最常用。當(dāng)然,還有其他修飾符,比如A表示強(qiáng)制從目標(biāo)字符串開頭匹配,x表示將模式中的空白忽略。

4.其他
常用符號(hào) 釋義
分支符號(hào)" " 用來(lái)匹配指定幾個(gè)規(guī)則中的一個(gè)
轉(zhuǎn)義符號(hào)"" 用于匹配"[""^""+"")"等有特殊含義符號(hào)
字符組 [] 用于匹配指定范圍之內(nèi)的任意一個(gè)字符

例如:表達(dá)式 [cChH]at 可以只能匹配到 cat、Cathat、Hat 四個(gè)字符串中的一個(gè)

例:敏感詞過(guò)濾。比如:“我草你媽哈哈背景天胡景濤哪肉涯剪短發(fā)欲望”,過(guò)濾:"草肉欲胡景濤"
let str9 = "我草你媽哈哈背景天胡景濤哪肉涯剪短發(fā)欲望";
let regExp = /草|肉|欲|胡景濤/g;
let result = str9.replace(regExp, function(match) {
    let len = match.length;
    let str;
    switch (len) {
        case 1:
            str = "*";
            break;
        case 2:
            str = "**";
            break;
        case 3:
            str = "***";
            break;
        default:
            str = "****";
    }
    return str;
});
console.log(result); //我*你媽哈哈背景天***哪*涯剪短發(fā)*望
分組捕獲與后向引用 1.分組捕獲

當(dāng)我們想要匹配多個(gè)字符的時(shí)候,可以使用限定符來(lái)指定個(gè)數(shù),那當(dāng)我們需要匹配多個(gè)字符串的情況,該怎么辦呢?可以使用分組捕獲。

概念:

分組捕獲是指將想要匹配的正則表達(dá)式用小括號(hào)括起來(lái),然后與限定符組合使用,可以連續(xù)匹配符合規(guī)則的字符串。每一個(gè)小括號(hào)代表的表達(dá)式分為一組,作為子表達(dá)式,后期可以通過(guò)捕獲不同組的內(nèi)容來(lái)進(jìn)行替換等操作。

例:匹配字符串isuwang連續(xù)出現(xiàn)3次的情況

isuwang{3}

(isuwang){3}

可以看到,下面一組例子將isuwang字符串當(dāng)作一個(gè)組,整體匹配了3次。

2.非捕獲分組

分組捕獲的缺點(diǎn):

有些不得不用()但是后期又不會(huì)用到的子表達(dá)式內(nèi)容,記錄在組里面會(huì)占用內(nèi)存,降低匹配效率

解決:

使用非捕獲組。只進(jìn)行分組,并不將子表達(dá)式匹配到的內(nèi)容捕獲到組里。

字符 描述 示例
(?:pattern) 匹配pattern,但不捕獲匹配結(jié)果。 ‘industr(?:y ies)匹配"industry"或"industries"
(?=pattern) 零寬度正向預(yù)查,不捕獲匹配結(jié)果。 "Windows (?=95 98 NT 2000)"匹配 "Windows2000" 中的 "Windows",不匹配 "Windows3.1" 中的 "Windows"。
(?!pattern) 零寬度負(fù)向預(yù)查,不捕獲匹配結(jié)果。 "Windows (?!95 98 NT 2000)"匹配 "Windows3.1" 中的 "Windows"不匹配 "Windows2000" 中的 "Windows"。
(?<=pattern) 零寬度正向回查,不捕獲匹配結(jié)果。 "2000 (?<=Office Word Excel)"匹配 " Office2000" 中的 "2000",不匹配 "Windows2000" 中的 "2000"。
(? 零寬度負(fù)向回查,不捕獲匹配結(jié)果。 "2000 (? Word Excel)"匹配 " Windows2000" 中的 "2000",不匹配 " Office2000" 中的 "2000"。

使用情況:

一般只有在比較復(fù)雜,“()”使用較多的情況下會(huì)考慮使用非捕獲組。比如驗(yàn)證日期的正則表達(dá)式。

對(duì)比:

未使用非捕獲組的正則

^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

使用了非捕獲組的正則:

^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
3.后向引用

作用:

后向引用用于重復(fù)搜索前面某個(gè)分組匹配的文本。例如,1 代表分組1匹配的文本,也可以用$1來(lái)表示

說(shuō)明:

子分組捕獲的內(nèi)容可在正則表達(dá)式里面或者其他文本里面作進(jìn)一步的處理。默認(rèn)情況下,從左向右,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1,第二個(gè)為2,以此類推。也可以使用命名分組的方式,對(duì)每個(gè)分組進(jìn)行命名。

例:檢查重復(fù)字符串
給定字符串 str,檢查其是否包含連續(xù)重復(fù)的字母(a-zA-Z),包含返回 true,否則返回false
let str4 = "abccdefgjhiss"
let reg4a = /([a-zA-Z])1/g
let reg4b = /([a-zA-Z]){2}/g
console.log(str4.match(reg4a)) // ["cc", "ss"]
console.log(str4.match(reg4b)) // ["ab", "cc", "de", "fg", "jh", "is"]
4.貪婪模式和非貪婪模式

貪婪模式:

在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配

非貪婪模式:

整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分NFA引擎所支持。

量詞:

貪婪模式 非貪婪模式
{m,n} {m,n}?
{m,} {m,}?
? ??
* *?
+ +?
例子:
提取兩個(gè)""中的子串,其中不能再包含""
字符串:"The colleagues in "kuaisuwang" are very "diligent" and united"

錯(cuò)誤解法(通過(guò)非貪婪匹配)

let str6=""The colleagues in "isuwang" are very "diligent" and united""
let reg6a=/".*?" /g // 注意"后面還有個(gè)空格
console.log(str6.match(reg6a)) // ?[""The colleagues in "isuwang" ", ""diligent" "]

正確解法(通過(guò)貪婪模式匹配)

let str6=""The colleagues in "isuwang" are very "diligent" and united""
let reg6b=/"[^"]*" /g // 注意"后面還有個(gè)空格
console.log(str6.match(reg6b)) //[""isuwang" ", ""diligent" "]
總結(jié)

此篇文章主要講述了常用的正則表達(dá)式符號(hào),以及分組和后向引用,貪婪模式和非貪婪模式兩種模式,這些知識(shí)點(diǎn)呢,在工作當(dāng)中會(huì)非常有用。至于正則表達(dá)式在我工作中的運(yùn)用,我放在下一篇來(lái)跟大家進(jìn)行分享。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99685.html

相關(guān)文章

  • Javascript正則達(dá)式詳解(一)

    摘要:定義在中,定義一個(gè)正則表達(dá)式有兩種方式,一種是直接量,另一種是使用構(gòu)造函數(shù)。元字符在正則表達(dá)式的模式中,有一些字符是有特殊含義的,被稱為元字符,如果要匹配元字符,則必須對(duì)其進(jìn)行轉(zhuǎn)義。正則表達(dá)式詳解二 簡(jiǎn)介 先來(lái)一段介紹: 正則表達(dá)式,又稱正規(guī)表示法、常規(guī)表示法(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。...

    zeyu 評(píng)論0 收藏0
  • Java 正則達(dá)式詳解

    摘要:正則表達(dá)式可以用于搜索編輯和操作文本。模式分組后會(huì)在正則表達(dá)式中創(chuàng)建反向引用。使正則忽略大小寫。注意方法不支持正則表達(dá)式。第三步,通過(guò)匹配對(duì)象,根據(jù)正則表達(dá)式操作字符串。正則表達(dá)式匹配數(shù)字范圍時(shí),首先要確定最大值與最小值,最后寫中間值。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000009162306 1. 正則表...

    Achilles 評(píng)論0 收藏0
  • 正則的貪婪,前瞻及屬性詳解

    摘要:正則的三種方法編譯正則表達(dá)式。返回找到的值,并確定其位置。規(guī)定匹配的類型。用于全局匹配,用于區(qū)分大小寫,用于全局區(qū)分大小寫的匹配。非貪婪匹配就是匹配到結(jié)果就好,就少的匹配字符。對(duì)象是否具有標(biāo)志。正則表達(dá)式的源文本。 對(duì)正則的深入學(xué)習(xí) 學(xué)習(xí)正則我們不能光看看幾個(gè)修飾符就可以了,因?yàn)檎齽t還有許多深入的知識(shí),下面我就來(lái)為大家扒一扒。。。showImg(https://segmentfault...

    pepperwang 評(píng)論0 收藏0
  • 詳解python中正則達(dá)式的反斜線的轉(zhuǎn)義功能

    摘要:最近深入研讀了正則表達(dá)式的一本經(jīng)典著作,對(duì)于在中使用正則表達(dá)式時(shí)使用反斜線轉(zhuǎn)義功能時(shí)有些心得,特與大家分享。核心思想在中使用正則表達(dá)式時(shí)要切記反斜線具有兩層轉(zhuǎn)義功能,如果你要匹配一個(gè)反斜線本身時(shí)要注意它必須被轉(zhuǎn)義兩次。 最近深入研讀了正則表達(dá)式的一本經(jīng)典著作,對(duì)于在python中使用正則表達(dá)式時(shí)使用反斜線轉(zhuǎn)義功能時(shí)有些心得,特與大家分享。 核心思想:在python中使用正則表達(dá)式時(shí)要...

    gggggggbong 評(píng)論0 收藏0
  • JS基礎(chǔ)篇--正則達(dá)式詳解

    摘要:下面整理一些常用的正則表達(dá)式。正則表達(dá)式中可以使用編碼。每個(gè)正則表達(dá)式可帶有一個(gè)或者多個(gè)標(biāo)注用以標(biāo)明正則表達(dá)式的行為。其中表示匹配項(xiàng)在字符串中的位置,而表示應(yīng)用字符串表達(dá)式的字符串。 正則表達(dá)式非常有用,查找、匹配、處理字符串、替換和轉(zhuǎn)換字符串,輸入輸出等。下面整理一些常用的正則表達(dá)式。 常用的正則字符 正則字符 描述 :將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè) 向...

    shmily 評(píng)論0 收藏0
  • JS之正則達(dá)式詳解

    摘要:正則表達(dá)式中可以使用編碼。每個(gè)正則表達(dá)式可帶有一個(gè)或者多個(gè)標(biāo)注用以標(biāo)明正則表達(dá)式的行為。其中表示匹配項(xiàng)在字符串中的位置,而表示應(yīng)用字符串表達(dá)式的字符串。方法正則表達(dá)式常用方法,它接受一個(gè)字符串參數(shù)。 正則表達(dá)式非常有用,查找、匹配、處理字符串、替換和轉(zhuǎn)換字符串,輸入輸出等。下面整理一些常用的正則表達(dá)式。 常用的正則字符 正則字符 描述 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、...

    xiguadada 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<