javaScript正則表達式整理

2020-08-12 16:29:14

元字元

\b 代表着單詞的開頭或結尾,也就是單詞的分界處。(只匹配一個位置)
. 匹配除了換行符以外的任意字元
* 匹配重複任意次(可能是0次)。它指定*前邊的內容可以連續重複使用任意次以使整個表達式得到匹配。
+ 匹配重複1次或更多次。
.* 任意數量的不包含換行的字元
\d 匹配一位數位(0,或1,或2,或……)
\s 匹配任意的空白符,包括空格,製表符(Tab),換行符,中文全形空格等。
\w 匹配字母或數位或下劃線或漢字等。
^ 匹配字串的開始
$ 匹配字串的結束

例子:

  • 0\d{2}-\d{8}:\d後面的{2}({8})的意思是前面\d必須連續重複匹配2次(8次)。
  • {5,12}:重複的次數不能少於5次,不能多於12次,否則都不匹配。

字元跳脫

查詢元字元本身**(. ,* ,+ ,/)**,得使用「\」來取消這些字元的特殊意義。

表示重複的所有限定符

* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次

字元類

  1. [aeiou]:匹配任何一個英文元音字母
  2. [.?!]:匹配標點符號(.或?或!)。

例子:
(?0\d{2}[) -]?\d{8}:首先是一個跳脫字元(,它能出現0次或1次(?),然後是一個0,後面跟着2個數字(\d{2}),然後是)或-或空格中的一個,它出現1次或不出現(?),最後是8個數字(\d{8})。

分支條件

匹配分枝條件時,將會從左到右地測試每個條件,如果滿足了某個分枝的話,就不會去再管其它的條件了。

例子:
\d{5}-\d{4}|\d{5}:用於匹配美國的郵政編碼。美國郵編的規則是5位數位,或者用連字號間隔的9位數位。(使用分枝條件時,要注意各個條件的順序)

分組

如果想要重複多個字元,用小括號來指定子表達式(也叫做分組),然後你就可以指定這個子表達式的重複次數了。

例子:
(\d{1,3}.){3}\d{1,3}:\d{1,3}匹配1到3位的數位,(\d{1,3}.){3}匹配三位數位加上一個英文句號(這個整體也就是這個分組)重複3次,最後再加上一個一到三位的數位(\d{1,3})
加粗樣式

反義

有時需要查詢不屬於某個能簡單定義的字元類的字元。比如想查詢除了數位以外,其它任意字元都行的情況,這時需要用到反義

\W 匹配任意不是字母,數位,下劃線,漢字的字元
\S 匹配任意不是空白符的字元
\D 匹配任意非數位的字元
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字元
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字元

例子:

  1. \S+ : 匹配不包含空白符的字串。
  2. <a[^>]+> : 匹配用尖括號括起來的以a開頭的字串。

後向參照

使用小括號指定一個子表達式後,匹配這個子表達式的文字(也就是此分組捕獲的內容)可以在表達式或其它程式中作進一步的處理。

1、後向參照用於重複搜尋前面某個分組匹配的文字。 例如,\1代表分組1匹配的文字。

例子:
1、\b(\w+)\b\s+\1\b : 可以用來匹配重複的單詞,像go go, 或者kitty kitty。

這個表達式首先是一個單詞,也就是單詞開始處和結束處之間的多於一個的字母或數位(\b(\w+)\b),這個單詞會被捕獲到編號爲1的分組中,然後是1個或幾個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。

2、也可以自己指定子表達式的組名。
要指定語法:(?<Word>\w+)(或者把尖括號換成’也行:(?‘Word’\w+))

這樣就把\w+的組名指定爲Word了。

要反向參照這個分組捕獲的內容,你可以使用\k<Word>.

在这里插入图片描述

零寬斷言

用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱爲零寬斷言。

1. 零寬度正預測先行斷言-------(?=exp) : 斷言自身出現的位置的後面能匹配表達式exp

例子:

  • \b\w+(?=ing\b) : 匹配以ing結尾的單詞的前面部分(除了ing以外的部分)。 如查詢I’m singing while you’re dancing.時,它會匹配sing和danc。

2. 零寬度正回顧後發斷言---------(?<=exp) : 斷言自身出現的位置的前面能匹配表達式exp

例子:

  • (?<=\bre)\w+\b : 匹配以re開頭的單詞的後半部分(除了re以外的部分)。
    例如在查詢reading a book時,它匹配ading。
  • (?<=\s)\d+(?=\s) : 匹配以空白符間隔的數位(再次強調,不包括這些空白符)。

註釋

小括號的另一種用途是通過語法(?#comment)來包含註釋。

例子:
2[0-4]\d(?#200-249)|250-5|[01]?\d\d?(?#0-199)

貪婪與懶惰

1. 貪婪匹配:匹配儘可能多的字元。

例子:
a.*b:匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。

2. 懶惰匹配,也就是匹配儘可能少的字元。只要在限定符後面加上「?」

例子:
.*? : 匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。
a.*?b : 匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字元)和ab(第四到第五個字元)。

在这里插入图片描述