JavaScript高階之正規表示式

2021-08-21 09:44:10 字數 4304 閱讀 9178

在js中使用正規表示式的目的是使用某種規則匹配字串或子字串

與建立陣列相同,建立regexp物件有兩種方法,一種是字面量,一種是使用建構函式。

使用字面量: var reg = /\d/g;     //用兩個斜槓包裹匹配規則

使用建構函式: var reg = new regexp('\\d', 'g');     //第乙個引數是匹配規則,同時需要對'\'進行轉義。

可以看到,在兩種定義方式中,都有乙個'g',它是正規表示式的修飾符。regexp包括的修飾符有:

'g':全文搜尋,否則只會匹配到第乙個結果為止

'i':忽略大小寫,無論大小寫都會進行匹配

'm':多行匹配

含義:在正規表示式中具有特殊含義的非字母字元

包括: .   ^   $  *  \    [  ]  

字元類通常情況下,正規表示式中的乙個字元匹配字串中的乙個字元,但是通過'[ ]'可以匹配多個字元。

var reg = /[abc]/g    //此表示式會匹配全文中的字母a或者b或者c

'a1b2c3d4'.replace(reg, 'x')       //最終結果是'x1x2x3d4'

還可以通過'^'字元匹配非操作:

var reg = /[^abc]/g         //此表示式會匹配全文中除了字母a、b、c以外的字元

範圍類很多時候,我們需要匹配字母,數字。使用字元類會顯得非常冗雜,例如:[0123456789]

使用字元 '-' 可以表示這種情況:

var reg = /[a-z]/g             //匹配全文中的小寫字母

var reg = /[a-za-z]/g     //匹配全文中的大小寫字母

如果字元 '-' 在兩個字元之間,表示範圍。如果想匹配 '-',則可以在後面加上字元 '-'

var reg = /[a-z-]/g         //匹配全文中的小寫字母和字元'-'

預定義類

在js中,定義了一些常用的字元供使用:

.    除了回車符合換行符的任意字元         [^\r\n]

\d    數字字元     ==       [0-9]    

\d   非數字字元              [^0-9]

\s    空白符                     [\r\n\t\f]

\s    非空白符                 [^\r\n\t\f]

\w   字母數字下劃線       [a-za-z0-9_]

\w   除了字母數字下劃線      [^a-za-z0-9_]

還有幾個代表邊界的字元:

^     以***為開始

$     以***為結束

\b    單詞邊界

\b   非單詞邊界

其中的元字元'^'在[ ]中時,表示的是除了,取反,但不在[ ]中時,表示的是以什麼為開頭。

量詞在我們想要表達出現5次的數字時,可以這樣寫:\d\d\d\d\d。但是當需要匹配出現100次的數字時,這種方式顯然是不現實的,在js中,也有一些量詞來修飾字元。

?        最多出現一次(0次或一次)

+         最少出現一次

*          出現任意次(可以是0次,可以是一次或以上)

出現n次

至少出現n次,最多出現m次

前面所說的匹配出現100次的數字可以是: \d

貪婪模式和非貪婪模式

一般情況下,js的匹配會盡可能多地匹配,例如'12345678'.replace(/\d/, 'x'),這種情況下應該匹配3個數字還是6個數字?在js中,會盡可能多匹配,所以會匹配6個數字,最後的結果就是'x78'。這種情況稱為貪婪模式。

那如果我們有需求,希望匹配3位數字,這時候可以使用修飾符 '?' ,例如'12345678'.replace(/\d?/, 'x'),那麼最後的結果就是'xx78'。這種情況稱為非貪婪模式。

分組有這樣一種場景,匹配出現三次的abcd,按照我們以前的想法,可能會這麼寫:/abcd/。但是請你冷靜分析一下,這樣寫的結果最後匹配到的是abcddd,而不是3次abcd。

這時候,就可以使用 '( )' 來進行分組,達到我們的效果:/(abcd)/

分組還有乙個更強大的功能,在分組**獲之後,可能根據其匹配的順序,使用'$1', '$2'等來代替**獲的分組。具體示例:

2016-12-21  ----->     12/21/2016

'2016-12-21'.repalce('/(\d)-(\d)-(\d)/', '$2/$1/$3')

其中的$1捕獲到的是2016, $2捕獲到的是12,$3捕獲到的是21

前瞻文字的尾部稱為前,前瞻的意思是在匹配到滿足條件的內容後,還會向前檢查是否符合斷言。符合才算匹配成功。具體示例:

希望將字母後面緊跟數字的字母替換成 'x'

var reg = /[a-za-z](?=\d)/     //其中的(?=\d)用來匹配斷言,即是字母後面緊跟的數字

var reg = /[a-za-z](?!\d)/      //其中的(?!\d)用來匹配字母後面緊跟的不是數字

在regexp物件的方法,常用的有test( )和exec( )

test( )用來檢測字串中是否有滿足匹配規則的結果,有的話返回true,沒有的話返回false

需要注意的是,需要注意的是,如果匹配規則中存在修飾符 'g',那匹配的結果會變得很詭異。你可能會看到一會是true,一會是false。(這是由於lastindex屬性的作用,因此在純粹去判斷是否在在字串中存在匹配內容時,不用加g)

var 

reg

= /\w/

if(reg.test('a1c2b4'))

exec( )返回的結果是乙個類陣列,陣列的第乙個值代表了匹配到的滿足的字串,第二值是匹配規則中的分組匹配到的值,第三個值是匹配規則中的分組匹配到的值(如果存在多個分組的話),同時儲存了乙個index屬性,表示滿足匹配的字串的起始位置,還有input屬性,表示源字串。

var 

reg

= /\w(\d)(\w)/, ret;

if(ret

= reg.exec('a1c2b4'))

結果是:

字串相關方法

str.search( reg)

用來搜尋字串中滿足匹配規則的第乙個字串,返回其index,否則返回-1。標誌'g'對結果沒有影響

str.match(reg)

用來匹配字串滿足匹配規則的乙個或多個字串。標誌 'g'對結果有影響。

當沒有標誌'g',即是非全域性呼叫的情況時,返回乙個類陣列。匹配到第乙個符合規則的字串為止。

var 

reg

= /\w(\d)(\w)/, ret;

if(ret

= 'a1c2b4'.match(reg))

返回的結果與exec返回的相同,類陣列的第乙個值是匹配到的字串,第二值是匹配規則中的分組匹配到的值,第三個值是匹配規則中的分組匹配到的值(如果存在多個分組的話),同時儲存了乙個index屬性,表示滿足匹配的字串的起始位置,還有input屬性,表示源字串。

如果有標誌'g',則返回乙個陣列,儲存的都是匹配到的字串結果。

var 

reg

= /\w(\d)(\w)/g, ret;

if(ret

= 'a1c2b4'.match(reg))

str.split(reg)將匹配到的字串作為分隔符劃分源字串得到陣列。

var 

reg

= /\d/g, ret;

ret

= 'a1b2c3d4'.split(reg)

最後得到的結果為:

將匹配到的字串替換成傳入的第二個字串。

var 

reg

= /\d/g, ret;

ret

= 'a1b2c3d4'.replace(reg, 'x');

最後的結果為:

JavaScript高階 正規表示式

前言 這篇部落格是我對正規表示式一些基礎知識的整理。基礎部分 1.1 什麼是正規表示式 是一種特殊的字串模式 作用是匹配字串 如同用模具做產品,正規表示式就是模具,具體的字串就是產品 定義一種規則去匹配復合規則的字串 1.2 元字元介紹 會匹配行或者字串的開頭,有時會匹配整個文件的起始位置 匹配字串...

Javascript 高階篇 正規表示式

淺拷貝 拷貝就是複製,就相當於把乙個物件中的所有的內容,複製乙份給另乙個物件,直接複製,或者說,就是把乙個物件的位址給了另乙個物件,他們指向相同,兩個物件之間有共同的屬性或者方法,都可以使用 var obj1 另乙個物件 var obj2 寫乙個函式,作用 把乙個物件的屬性複製到另乙個物件中,淺拷貝...

Python總結之 正則高階

原來寫過一篇關於正規表示式的文章,這裡再補充幾個實際專案中用到的例子.注意 下面樣例都是scala 1 捕獲組命名 使用捕獲組的時候,程式設計師可能需要趴在顯示器上,用一張紙擋著螢幕,從左往右數括號,聚精會神好像拆彈,而且正規表示式一旦發生變化,group的index也會變.有潔癖的程式設計師不願意...