摘要:學習正則表達式也是如此,循序漸進,方能厚積薄發(fā)。概念分組捕獲是指將想要匹配的正則表達式用小括號括起來,然后與限定符組合使用,可以連續(xù)匹配符合規(guī)則的字符串。
正則表達式是一個非常有用的用來匹配驗證字符串的工具。很多人覺得正則表達式規(guī)則繁多,學了也會忘記,不如等到需要使用的時候再去查閱即可。這樣的觀點也無可厚非,不過我曾經看到過一個絕妙的關于閱讀的比喻,閱讀就像是將竹簍浸入到水里面,雖然撈打上來的時候竹簍里并沒有裝水,但是竹簍已經被浸濕了。學習正則表達式也是如此,循序漸進,方能厚積薄發(fā)。
大綱◆ 常用的正則表達式
◆ 分組捕獲與后向引用
◆ 貪婪模式與非貪婪模式
◆ 應用場景
常用的正則表達式 1.元字符元字符 | 釋義 |
---|---|
普通字符 | 如A-Z、a-z、0-9 等等 |
. | 除換行以外的其他任意字符, 如果需要匹配換行符,可用[.n] |
s | 空白字符 |
S | 除空白字符以外的任意字符 |
w | 字母、數字、下劃線 |
W | 除了字母、數字、下劃線以外的任意字符 |
d | 數字 0-9 |
D | 除了數字之外的任意字符 |
^ | 匹配輸入字符串開始的位置 |
$ | 匹配輸入字符串結尾的位置 |
b | 單詞邊界,匹配一個完整的單詞可以使用 bwordb |
以上是最常用的正則表達式匹配字符,當然,還有很多其他的匹配元字符,比如 匹配制表符, 匹配回車符, 匹配換行符等。
以d為例,d代表數字0-9,等價于字符組[0-9]
例:匹配字符串 ‘fefafe332gt66ooj44nie85kk’ 中的所有數字
var str = "fefafe332gt66ooj44nie85kk" var reg = /d+/g console.log(str.match(reg)) // 結果為["332", "66", "44", "85"]2.限定符
限定符 | 釋義 |
---|---|
* | 0到無數次。例如,zo* 能匹配 "z" 以及 "zoo" |
+ | 1到無數次。例如,zo+ 不能匹配 “z” 但是能匹配 “zo”和“zoo” |
? | 0 或者1 次。例如,zo? 能匹配 “z”和 “zo” 但是不能匹配 “zoo” |
{n} | 匹配確定的N次。 例如, zo{2} 只能匹配到 zoo |
{n,} | 匹配n到無限次。 例如,zo{1,} 不能匹配“z” 但是能匹配“zo”和“zoo” |
{n,m} | 匹配n到m次。注意:在逗號和兩個數之間不能有空格 |
以上這些限定符,可以匹配指定個數的字符,在能夠匹配的范圍之內,盡可能多的匹配。其中{n,m}限定符有兩個注意點:
n不能大于m
在逗號和兩個數之間不能有空格,否則無法匹配
例:匹配38到288之間的數
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 全局搜索 (不添加 搜索到第一個匹配停止) |
i | ignore case 忽略大小寫 |
m | multiline 多行匹配 |
m多行匹配用得相對較少,但是也有一定用處。
例:對比m和mg
var str8 = "abeifenabc abpheeabc" var reg8a = /^ab/gm var reg8b = /^ab/g console.log(str8.match("gm:"+reg8a)) // 結果為:["ab", "ab"] console.log(str8.match("g:"+reg8b)) // 結果為:["ab"]
上面三個修飾符最常用。當然,還有其他修飾符,比如A表示強制從目標字符串開頭匹配,x表示將模式中的空白忽略。
4.其他常用符號 | 釋義 | |
---|---|---|
分支符號" | " | 用來匹配指定幾個規(guī)則中的一個 |
轉義符號"" | 用于匹配"[""^""+"")"等有特殊含義符號 | |
字符組 [] | 用于匹配指定范圍之內的任意一個字符 |
例如:表達式 [cChH]at 可以只能匹配到 cat、Cat、hat、Hat 四個字符串中的一個
例:敏感詞過濾。比如:“我草你媽哈哈背景天胡景濤哪肉涯剪短發(fā)欲望”,過濾:"草肉欲胡景濤"
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.分組捕獲
當我們想要匹配多個字符的時候,可以使用限定符來指定個數,那當我們需要匹配多個字符串的情況,該怎么辦呢?可以使用分組捕獲。
概念:
分組捕獲是指將想要匹配的正則表達式用小括號括起來,然后與限定符組合使用,可以連續(xù)匹配符合規(guī)則的字符串。每一個小括號代表的表達式分為一組,作為子表達式,后期可以通過捕獲不同組的內容來進行替換等操作。
例:匹配字符串isuwang連續(xù)出現3次的情況
isuwang{3}
(isuwang){3}
可以看到,下面一組例子將isuwang字符串當作一個組,整體匹配了3次。
2.非捕獲分組分組捕獲的缺點:
有些不得不用()但是后期又不會用到的子表達式內容,記錄在組里面會占用內存,降低匹配效率
解決:
使用非捕獲組。只進行分組,并不將子表達式匹配到的內容捕獲到組里。
字符 | 描述 | 示例 | |||
---|---|---|---|---|---|
(?:pattern) | 匹配pattern,但不捕獲匹配結果。 | ‘industr(?:y | ies)匹配"industry"或"industries" | ||
(?=pattern) | 零寬度正向預查,不捕獲匹配結果。 | "Windows (?=95 | 98 | NT | 2000)"匹配 "Windows2000" 中的 "Windows",不匹配 "Windows3.1" 中的 "Windows"。 |
(?!pattern) | 零寬度負向預查,不捕獲匹配結果。 | "Windows (?!95 | 98 | NT | 2000)"匹配 "Windows3.1" 中的 "Windows"不匹配 "Windows2000" 中的 "Windows"。 |
(?<=pattern) | 零寬度正向回查,不捕獲匹配結果。 | "2000 (?<=Office | Word | Excel)"匹配 " Office2000" 中的 "2000",不匹配 "Windows2000" 中的 "2000"。 | |
(? | 零寬度負向回查,不捕獲匹配結果。 | "2000 (? | Word | Excel)"匹配 " Windows2000" 中的 "2000",不匹配 " Office2000" 中的 "2000"。 |
使用情況:
一般只有在比較復雜,“()”使用較多的情況下會考慮使用非捕獲組。比如驗證日期的正則表達式。
對比:
未使用非捕獲組的正則
^((?!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.后向引用
作用:
后向引用用于重復搜索前面某個分組匹配的文本。例如,1 代表分組1匹配的文本,也可以用$1來表示
說明:
子分組捕獲的內容可在正則表達式里面或者其他文本里面作進一步的處理。默認情況下,從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。也可以使用命名分組的方式,對每個分組進行命名。
例:檢查重復字符串
給定字符串 str,檢查其是否包含連續(xù)重復的字母(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.貪婪模式和非貪婪模式
貪婪模式:
在整個表達式匹配成功的前提下,盡可能多的匹配
非貪婪模式:
整個表達式匹配成功的前提下,盡可能少的匹配。非貪婪模式只被部分NFA引擎所支持。
量詞:
貪婪模式 | 非貪婪模式 |
---|---|
{m,n} | {m,n}? |
{m,} | {m,}? |
? | ?? |
* | *? |
+ | +? |
例子:
提取兩個""中的子串,其中不能再包含""
字符串:"The colleagues in "kuaisuwang" are very "diligent" and united"
錯誤解法(通過非貪婪匹配)
let str6=""The colleagues in "isuwang" are very "diligent" and united"" let reg6a=/".*?" /g // 注意"后面還有個空格 console.log(str6.match(reg6a)) // ?[""The colleagues in "isuwang" ", ""diligent" "]
正確解法(通過貪婪模式匹配)
let str6=""The colleagues in "isuwang" are very "diligent" and united"" let reg6b=/"[^"]*" /g // 注意"后面還有個空格 console.log(str6.match(reg6b)) //[""isuwang" ", ""diligent" "]總結
此篇文章主要講述了常用的正則表達式符號,以及分組和后向引用,貪婪模式和非貪婪模式兩種模式,這些知識點呢,在工作當中會非常有用。至于正則表達式在我工作中的運用,我放在下一篇來跟大家進行分享。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99685.html
摘要:定義在中,定義一個正則表達式有兩種方式,一種是直接量,另一種是使用構造函數。元字符在正則表達式的模式中,有一些字符是有特殊含義的,被稱為元字符,如果要匹配元字符,則必須對其進行轉義。正則表達式詳解二 簡介 先來一段介紹: 正則表達式,又稱正規(guī)表示法、常規(guī)表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。...
摘要:正則表達式可以用于搜索編輯和操作文本。模式分組后會在正則表達式中創(chuàng)建反向引用。使正則忽略大小寫。注意方法不支持正則表達式。第三步,通過匹配對象,根據正則表達式操作字符串。正則表達式匹配數字范圍時,首先要確定最大值與最小值,最后寫中間值。 版權聲明:本文由吳仙杰創(chuàng)作整理,轉載請注明出處:https://segmentfault.com/a/1190000009162306 1. 正則表...
摘要:正則的三種方法編譯正則表達式。返回找到的值,并確定其位置。規(guī)定匹配的類型。用于全局匹配,用于區(qū)分大小寫,用于全局區(qū)分大小寫的匹配。非貪婪匹配就是匹配到結果就好,就少的匹配字符。對象是否具有標志。正則表達式的源文本。 對正則的深入學習 學習正則我們不能光看看幾個修飾符就可以了,因為正則還有許多深入的知識,下面我就來為大家扒一扒。。。showImg(https://segmentfault...
摘要:最近深入研讀了正則表達式的一本經典著作,對于在中使用正則表達式時使用反斜線轉義功能時有些心得,特與大家分享。核心思想在中使用正則表達式時要切記反斜線具有兩層轉義功能,如果你要匹配一個反斜線本身時要注意它必須被轉義兩次。 最近深入研讀了正則表達式的一本經典著作,對于在python中使用正則表達式時使用反斜線轉義功能時有些心得,特與大家分享。 核心思想:在python中使用正則表達式時要...
摘要:下面整理一些常用的正則表達式。正則表達式中可以使用編碼。每個正則表達式可帶有一個或者多個標注用以標明正則表達式的行為。其中表示匹配項在字符串中的位置,而表示應用字符串表達式的字符串。 正則表達式非常有用,查找、匹配、處理字符串、替換和轉換字符串,輸入輸出等。下面整理一些常用的正則表達式。 常用的正則字符 正則字符 描述 :將下一個字符標記為一個特殊字符、或一個原義字符、或一個 向...
摘要:正則表達式中可以使用編碼。每個正則表達式可帶有一個或者多個標注用以標明正則表達式的行為。其中表示匹配項在字符串中的位置,而表示應用字符串表達式的字符串。方法正則表達式常用方法,它接受一個字符串參數。 正則表達式非常有用,查找、匹配、處理字符串、替換和轉換字符串,輸入輸出等。下面整理一些常用的正則表達式。 常用的正則字符 正則字符 描述 將下一個字符標記為一個特殊字符、...
閱讀 2689·2023-04-25 17:21
閱讀 2550·2021-11-23 09:51
閱讀 2837·2021-09-24 10:32
閱讀 3769·2021-09-23 11:33
閱讀 1974·2019-08-30 15:44
閱讀 3452·2019-08-30 11:18
閱讀 3519·2019-08-30 10:53
閱讀 623·2019-08-26 13:25