正則問題整理

 字符串的正則方法有: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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章