正則表示式
正則表示式(簡稱 regex)允許開發者將字串與模式進行匹配,提取子匹配資訊,或簡單地測試字串是否符合該模式。正則表示式在許多程式語言中都有使用,而 JavaScript 的語法則受到了 Perl 的啟發。
建議你閱讀正則表示式指南,以瞭解可用的 regex 語法及其工作原理。
描述
正則表示式是形式語言理論中的一個重要概念。它們是一種描述可能無限的字元集(稱為語言)的方式。正則表示式的核心需要以下特性:
假設有一個有限的字母表(例如英語字母表的 26 個字母,或整個 Unicode 字元集),所有正則語言都可以透過上述特性生成。當然,許多模式以這種方式表達非常繁瑣(例如“10 位數字”或“不是空格的字元”),因此 JavaScript 正則表示式包含許多速記方式,將在下面介紹。
注意:由於存在反向引用(正則表示式必須具有有限狀態),JavaScript 正則表示式實際上並非正則的。但是,它們仍然是非常有用的特性。
建立正則表示式
正則表示式通常透過將模式用正斜槓(/)括起來作為字面量建立。
const regex1 = /ab+c/g;
正則表示式也可以透過 RegExp() 建構函式建立。
const regex2 = new RegExp("ab+c", "g");
它們在執行時沒有差異,儘管它們可能會對效能、靜態可分析性和字元轉義的編寫人體工程學產生影響。有關更多資訊,請參閱 RegExp 參考。
正則表示式標誌
標誌是特殊的引數,可以改變正則表示式的解釋方式或其與輸入文字的互動方式。每個標誌都對應於 RegExp 物件上的一個訪問器屬性。
| 標誌 | 描述 | 對應屬性 |
|---|---|---|
d |
為子字串匹配生成索引。 | hasIndices |
g |
全域性搜尋。 | global |
i |
不區分大小寫的搜尋。 | ignoreCase |
m |
使 ^ 和 $ 匹配每行的開頭和結尾,而不是整個字串的開頭和結尾。 |
multiline |
s |
允許 . 匹配換行符。 |
dotAll |
u |
“Unicode”;將模式視為 Unicode 碼點序列。 | unicode |
v |
u 模式的升級版,具有更多 Unicode 功能。 |
unicodeSets |
y |
執行“粘性”搜尋,從目標字串中的當前位置開始匹配。 | |
i、m 和 s 標誌可以使用修飾符語法在正則表示式的特定部分啟用或停用。
以下部分列出了所有可用的正則表示式語法,按其語法性質分組。
斷言
斷言是測試字串在指定位置是否滿足特定條件但不消耗字元的構造。斷言不能量化。
- 輸入邊界斷言:
^、$ -
斷言當前位置是輸入的開始或結束,如果設定了
m標誌,則為行的開始或結束。 - 先行斷言:
(?=...)、(?!...) -
斷言當前位置後面是或不是某個模式。
- 後行斷言:
(?<=...)、(?<!...) -
斷言當前位置前面是或不是某個模式。
- 單詞邊界斷言:
\b、\B -
斷言當前位置是單詞邊界。
原子
原子是正則表示式最基本的單元。每個原子消耗字串中的一個或多個字元,然後匹配失敗或允許模式繼續與下一個原子匹配。
- 反向引用:
\1、\2 -
匹配先前用捕獲組捕獲的子模式。
- 捕獲組:
(...) -
匹配子模式並記住有關匹配的資訊。
- 字元類:
[...]、[^...] -
匹配字元集中或不在字元集中的任何字元。當
v標誌啟用時,它也可以用於匹配有限長度的字串。 - 字元類轉義:
\d、\D、\w、\W、\s、\S -
匹配預定義字元集中或不在預定義字元集中的任何字元。
- 字元轉義:
\n、\u{...} -
匹配可能無法方便地以其字面形式表示的字元。
- 字面量字元:
a、b -
匹配特定字元。
- 修飾符:
(?ims-ims:...) -
覆蓋正則表示式特定部分的標誌設定。
- 命名反向引用:
\k<name> -
匹配先前用命名捕獲組捕獲的子模式。
- 命名捕獲組:
(?<name>...) -
匹配子模式並記住有關匹配的資訊。該組以後可以透過自定義名稱而不是其在模式中的索引來識別。
- 非捕獲組:
(?:...) -
匹配子模式而不記住有關匹配的資訊。
- Unicode 字元類轉義:
\p{...}、\P{...} -
匹配由 Unicode 屬性指定的一組字元。當
v標誌啟用時,它也可以用於匹配有限長度的字串。 - 萬用字元:
. -
匹配除行終止符之外的任何字元,除非設定了
s標誌。
其他特性
這些特性本身不指定任何模式,但用於組合模式。
- 析取:
| -
匹配由
|字元分隔的一組備選項中的任何一個。 - 量詞:
*、+、?、{n}、{n,}、{n,m} -
匹配原子特定次數。
轉義序列
正則表示式中的轉義序列指的是由 \ 後跟一個或多個字元組成的任何語法。它們可能根據 \ 後跟的內容而具有非常不同的目的。下面列出了所有有效的“轉義序列”
| 轉義序列 | 後跟 | 含義 |
|---|---|---|
\B |
None | 非單詞邊界斷言 |
\D |
None | 字元類轉義表示非數字字元 |
\P |
{,一個 Unicode 屬性和/或值,然後是 } |
Unicode 字元類轉義表示沒有指定 Unicode 屬性的字元 |
\S |
None | 字元類轉義表示非空白字元 |
\W |
None | 字元類轉義表示非單詞字元 |
\b |
None | 單詞邊界斷言;在字元類內部,表示 U+0008 (BACKSPACE) |
\c |
從 A 到 Z 或 a 到 z 的字母 |
一個字元轉義表示控制字元,其值等於字母的字元值模 32 |
\d |
None | 字元類轉義表示數字字元(0 到 9) |
\f |
None | 字元轉義表示 U+000C (FORM FEED) |
\k |
<,一個識別符號,然後是 > |
一個命名反向引用 |
\n |
None | 字元轉義表示 U+000A (LINE FEED) |
\p |
{,一個 Unicode 屬性和/或值,然後是 } |
Unicode 字元類轉義表示具有指定 Unicode 屬性的字元 |
\q |
{,一個字串,然後是 } |
僅在v 模式字元類中有效;表示要字面匹配的字串 |
\r |
None | 字元轉義表示 U+000D (CARRIAGE RETURN) |
\s |
None | 字元類轉義表示空白字元 |
\t |
None | 字元轉義表示 U+0009 (CHARACTER TABULATION) |
\u |
4 個十六進位制數字;或 {,1 到 6 個十六進位制數字,然後是 } |
字元轉義表示具有給定碼點的字元 |
\v |
None | 字元轉義表示 U+000B (LINE TABULATION) |
\w |
None | 字元類轉義表示單詞字元(A 到 Z、a 到 z、0 到 9、_) |
\x |
2 個十六進位制數字 | 字元轉義表示具有給定值的字元 |
\0 |
None | 字元轉義表示 U+0000 (NULL) |
\ 後跟 0 和另一個數字成為遺留八進位制轉義序列,在Unicode 感知模式中是禁止的。\ 後跟任何其他數字序列成為反向引用。
此外,\ 可以後跟一些非字母或非數字字元,在這種情況下,轉義序列始終是字元轉義,表示跳脫字元本身
\$,\(,\),\*,\+,\.,\/,\?,\[,\\,\],\^,\{,\|,\}:隨處有效\-:僅在字元類中有效\!,\#,\%,\&,\,,\:,\;,\<,\=,\>,\@,\`,\~:僅在v模式字元類中有效
其他 ASCII 字元,即空格字元、"、'、_ 和任何上述未提及的字母字元,都不是有效的轉義序列。在Unicode 非感知模式中,不是上述之一的轉義序列成為標識轉義:它們表示反斜槓後面的字元。例如,\a 表示字元 a。這種行為限制了在不引起向後相容性問題的情況下引入新轉義序列的能力,因此在 Unicode 感知模式中是被禁止的。
規範
瀏覽器相容性
載入中…