什么是正則表達式
- 正則表達式,英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE
- 正則表達式是由一個字符序列形成的搜索模式。
- 當你在文本中搜索數據時,你可以用搜索模式來描述你要查詢的內容。
- 正則表達式可以是一個簡單的字符,或一個更復雜的模式。
- 正則表達式可用於所有文本搜索和文本替換的操作。
正則表達式的組成
- 正則定界符
- 原子
- 元字符
- 模式修正符
正則定界符
-
在JS中正則表達式的定界符就是一對/,所有寫在/之內的都是正則的內容。
-
注意:在其他語言中可以使用其他特殊符號作為正則定界符。
原子
原子是組成正則表達式最基本的單位。任何一個正則表達式至少包含一個原子。
- 所有可見和不可見的字符都是原子!
- 6個特殊原子:
- \d 表示0-9之間的任意一個數字字符
- \D 表示除了0-9之外的任意一個字符
- \s 表示所有不可見字符中的任意一個字符
- \S 表示所有可見字符中的任意一個字符
- \w 表示數字,字母和下划線中的任意一個字符
- \W 表示數字,字母下划線之外的任意一個字符
元字符
元字符的作用就是用來修飾原子,使得正則表達式的結構更加靈活可靠。元字符也叫作原子修飾符。
[]
原子列表
-
用戶可以通過原子列表的方式自定義指定范圍的字符。原子列表依然表示指定范圍字符中的一個字符。
-
注意: 原子列表表示多個字符中的一個字符。
[^]
排除列表
-
排除列表是原子列表的提升,可以限定選取制定字符之外的字符中的一個。
-
注意: 如果列表(原子/排除列表)中的字符在ASCII碼上是連續的,可以進行縮寫操作
- [ABCDEFG] -> [A-G]
- [2345678] -> [2-8]
- [abcdefghijklmnopqrstuvwxyz] -> [a-z]
\*
任意數量的指定原子
\+
一個數量以上的原子
?
表示0個或1個原子
{}
圈定范圍
-
{m} 表示m個原子
-
{m,} 表示m個以上的原子
-
{m,n} 表示m-n個數量之間原子
^
表示字符串必須以正則中指定的字符開頭!
$
表示字符串必須以正則中指定的字符結尾!
^正則表達式$ 精確匹配模式
\b
單詞邊界
表示能夠用來分割單詞的字符, 空格,標點符號,特殊字符(除了數字和字母)
\B
非單詞邊界
表示不能夠用於分割單詞的字符。 數字和字母
注意:詞邊界和非詞邊界一般只用於英文正則中。
. 表示除了\n
之外的任意一個字符
注意:如果正則中需要使用字符。 必須進行轉義 \。
除此之外,任意在正則表達式中又意義的字符要當做普通字符使用都必須進行轉義操作(。 * + ? [] () ^ $)
()
括號元字符
- 可以將多個原子當做一個原子使用,可以添加元字符修飾。
- 將()中的內容暫時存於內存當中,方便后期調用。
- 改變正則的優先級,嘗嘗和|一起使用
|
或運算元字符
- 表示在|兩側的正則進行二選一操作
模式修正符
- 對匹配模式進行調節的符號。
- 模式修正符在定界符的最后使用。
- var 變量 = /正則內容/模式修正符;
i
忽略英文大小寫
g
全局匹配模式
m
多行匹配模式
.*?
貪婪模式與惰性模式
-
正則在進行匹配時,從開始位置查找最遠的結束位置,這種模式稱之為貪婪模式。
-
在進行HTML標簽類似內容獲取時,貪婪模式會導致整個內容的返回,需要使用非貪婪模式。
-
固定的書寫規則 : .*? 這種方式就是非貪婪模式,或者說是惰性模式
?:
取消暫存內容的作用
- 取消暫存內容的作用,只留運算優先級的作用
- 在
()
最前面 加上?:
字符串 例如(?:/\d/)
正則表達式對象
聲明正則表達式的格式:
var 變量 = /正則規則/模式修正符;
var a = /\d/g;
使用對象聲明正則表達式:
var 變量 = new RegExp('正則規則','模式修正符');
var a = new RegExp('\\d', 'g');
\\
轉義
成員屬性
source
- 表示當前正則表達式的正則規則
var a = /\d/g;
var b = a.source;
console.log(b);
輸出:\d
獲取結果不包括在正則表達式文本中使用的分隔斜線,並且它不包括在“g”,“i” 和“m” 屬性。
lastIndex
- 匹配模式中帶有g修飾符,這個屬性存儲在整個字符串中下一次檢索的開始位置
- 注意: 僅在g模式下會發生變化,沒有g模式,該屬性永遠為0
成員方法
exec() 進行一次正則匹配
- 在g模式下,每一次匹配都會在上一次匹配的位置之后開始繼續匹配
- 在非g模式下,每次一次匹配都會從字符串的開頭重新匹配。
- 格式: 正則對象。
exec(字符串)
; exec()
和match()
的區別:- 如果在非g模式下,
exec()
和match()
除了操作格式不一樣,結果是一樣的。 - 在g模式下,
exec()
依然進行一次匹配,只不過在上次匹配的內容之后開始一次新的匹配 - 在g模式下,
match()
是一次性返回字符串中所有符合正則內容組成的數組。
- 如果在非g模式下,
test() 進行正則測試
它的參數是一個字符串,用test( )對某個字符串進行檢測,該方法僅僅是用於測試正則內容是否在字符串中出現,匹配成功返回true,匹配失敗返回false。
compile() 重新編譯正則,垃圾回收再用
- 格式: 正則對象.compile('正則規則','模式修正符')
- 該方法主要用於避免再次創建正則對象,將之前的正則對象修改規則之后繼續使用,可以提高程序效率