正則問題整理

方帥發表於2021-01-11

 字串的正則方法有:match()、replace()、search()、split()

 正則物件的方法有:exec()、test()

正則方法講解

match()

功能:使用正規表示式模式對字串執行查詢,並將包含查詢的結果作為陣列返回
函式格式:stringObj.match(rgExp) stringObj為字串必選 rgExp為正規表示式必選項
返回值:如果能匹配則返回結果陣列,如果不能匹配返回null

replace()

功能:用指定的字串替換字串中與正規表示式匹配的子字串。

語法結構:

stringObject.replace(regexp,replacement)

返回值:是一個替換後的新字串。

search()

功能:返回與正規表示式查詢內容匹配的第一個子字串的位置
語法:stringObj.search(rgExp)
返回值:search 方法指明是否存在相應的匹配。如果找到一個匹配,search方法將返回一個整數值,指明這個匹配距離字串開始的偏移位置。如果沒有找到匹配,則返回 -1

split()

split() 方法用於把一個字串分割成字串陣列。
語法
stringObject.split(separator,howmany)
引數 描述
separator 必需。字串或正規表示式,從該引數指定的地方分割 stringObject。
howmany 可選。該引數可指定返回的陣列的最大長度。如果設定了該引數,返回的子串不會多於這個引數指定的陣列。如果沒有設定該引數,整個字串都會被分割,不考慮它的長度。
返回值
一個字串陣列。該陣列是通過在 separator 指定的邊界處將字串 stringObject 分割成子串建立的。返回的陣列中的字串不包括 separator 自身。
但是,如果 separator 是包含子表示式的正規表示式,那麼返回的陣列中包括與這些子表示式匹配的字串(但不包括與整個正規表示式匹配的文字)

exec()

語法結構:

RegExpObject.exec(string)

正規表示式exec()函式:

exec() 方法用於檢索字串中的正規表示式的匹配。
返回值是一個陣列,但是此陣列的內容和正則物件是否是全域性匹配有著很大關係:

1.沒有g修飾符:
在非全域性匹配模式下,此函式的作用和match()函式是一樣的,只能夠在字串中匹配一次,如果沒有找到匹配的字串,那麼返回null,否則將返回一個陣列,陣列的第0個元素儲存的是匹配字串,第1個元素存放的是第一個引用型分組(子表示式)匹配的字串,第2個元素存放的是第二個引用型分組(子表示式)匹配的字串,依次類推。同時此陣列還包括兩個物件屬性,index屬性宣告的是匹配字串的起始字元在要匹配的完整字串中的位置,input屬性宣告的是對要匹配的完整字串的引用。
特別說明:
在非全域性匹配模式下,IE瀏覽器還會具有lastIndex屬性,不過這時是隻讀的。

2.具有g修飾符:
在全域性匹配模式下,此函式返回值同樣是一個陣列,並且也只能夠在字串中匹配一次。不過此時,此函式一般會和lastIndex屬性匹配使用,此函式會在lastIndex屬性指定的字元處開始檢索字串,當exec()找到與表示式相匹配的字串時,在匹配後,它將lastIndex 屬性設定為匹配字串的最後一個字元的下一個位置。可以通過反覆呼叫exec()函式遍歷字串中的所有匹配,當exec()函式再也找不到匹配的文字時,它將返回null,並把lastIndex 屬性重置為0。
陣列的內容結構和沒有g修飾符時完全相同。

特別說明:

如果在一個字串中完成了一次模式匹配之後要開始檢索新的字串,就必須手動地把lastIndex屬性重置為0。

test()

用於檢測一個字串是否匹配某個模式.

返回一個 Boolean 值,它指出在被查詢的字串中是否匹配給出的正規表示式。 
regexp.test(str)

正則匹配注意要點

正規表示式test(),正則加g和不加g的區別

問題如下圖:3在正則測試時為false

 

g表示全文查詢。而且在正規表示式內部有一個**lastIndex**來記錄匹配的位置,第一次呼叫reg後,那麼lastIndex就不再等於0,當下次在呼叫該方法的時候,字串的匹配會從lastIndex位置進行匹配,所以因為lastIndex的變化匹配str內的數字是跳著匹配的,只要去掉g就可以了

 

用\w匹配單詞遇到空串的問題

我使用了\w*  結果如下圖  沒隔一個單詞出現一個空。原因就在於用了*  (重複零次或更多次),改為+(重複一次或更多次)就好了,就是說最少有一個字母才算一個單詞。

  

 

正則匹配分組時加不加g(是否全域性搜尋)的match結果

有()分組不設定g時,匹配第一個整體符合正則規則的字串,返回結果陣列第一個值“2010-01-9”,並且可以分別匹配出每一個分組的值從陣列下第二個值開始,["2010","01","9"];

有()分組且設定g時,匹配所有符合正則規則的字串,返回結果[“2010-01-9”,“2011-9-8”];

無()分組不設定g時,匹配第一個整體符合正則規則的字串,返回結果[“2010-01-9”];

無()分組且設定g時,匹配所有符合正則規則的字串,返回結果[“2010-01-9”,“2011-9-8”];

exec 從字串中提取(每次只能匹配一組資料)

 

 

 如果想全部匹配  可以加g,需要多次執行exec。(參照第一個問題說到的lastIndex)

如果正則中有分組,使用/g可以匹配出所有符合正則規則的字串,且內部有分組

 

split切割+正規表示式

var dataStr = '2020/1-6'
// 將上面的字串中日期格式切割成年、月、日
console.log(dataStr.split(/[/-]/))// 利用正規表示式匹配出/或

 

使用Reg.$1-Reg.$9提取

RegExp 是javascript中的一個內建物件。為正規表示式。

RegExp.$1是RegExp的一個屬性,指的是與正規表示式匹配的第一個 子匹配(以括號為標誌)字串,以此類推,RegExp.$2,RegExp.$3,..RegExp.$99總共可以有99個匹配

如果你直接在控制檯列印RegExp, 出現的一定是一個空字串: ""。那麼, 我們在什麼時候可以使用RegExp.$1呢?

其實RegExp這個物件會在我們呼叫了正規表示式的方法後, 自動將最近一次的結果儲存在裡面, 所以如果我們在使用正規表示式時, 有用到分組, 那麼就可以直接在呼叫完以後直接使用RegExp.$xx來使用捕獲到的分組內容, 如下

const r = /^(\d{4})-(\d{1,2})-(\d{1,2})$/
r.exec('2019-10-08')
console.log(RegExp.$1) // 2019
console.log(RegExp.$2) // 10
console.log(RegExp.$3) // 08

 

 

相關文章