快速入門
教學
工具與語言
範例
參考
書籍評論
正規表示式工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言與程式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 與 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站的更多內容
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式與語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 與部落格
RegexBuddy—The best regex editor and tester for JavaScript developers!

使用 JavaScript 的正規表示式

JavaScript 的正規表示式風格是 ECMA-262 語言標準的一部分。這表示您的正規表示式應可在所有 JavaScript 實作中以完全相同的方式運作。過去有許多嚴重的瀏覽器特定問題。但現代瀏覽器在遵循正規表示式的 JavaScript 標準方面做得很好。您只需要確定您的網頁具有請求瀏覽器使用標準模式而非奇異模式的 DOCTYPE。

JavaScript 的正規表示式風格

在 JavaScript 原始碼中,正規表示式以 /pattern/modifiers 的形式撰寫,其中「pattern」是正規表示式本身,而「modifiers」是一系列表示各種選項的字元。「modifiers」部分是選用的。此語法取自 Perl。JavaScript 支援下列 modifiers,這是 Perl 支援的子集

您可以透過將多個 modifiers 串接在一起的方式來結合它們,例如 /regex/gim。值得注意的是,沒有選項可以 讓句點比對換行符號字元

由於正斜線用於分隔正規表示式,因此出現在正規表示式中的任何正斜線都需要進行跳脫。例如,正規表示式 1/2 在 JavaScript 中寫作 /1\/2/

若要匹配不含 /s 的絕對任何字元,可以使用包含 字元類別 和其否定版本(例如 [\s\S])的 簡寫類別

JavaScript 實作 Perl 風格的正規表示式。然而,它缺少 Perl 和其他現代正規表示式風格中相當多的進階功能。

這些功能中的許多功能都可以在 JavaScript 的 XRegExp 函式庫 中找到。

  • 後向參考 在很長一段時間內都是 JavaScript 正規表示式語法中的重大遺漏。後向參考是 ECMAScript 2018 規範的一部分。它受到最新版本的 Chrome、Edge 和 Firefox 支援,但不受 Internet Explorer 等舊瀏覽器支援。
  • 字串類別的正規表示式方法

    若要測試特定正規表示式是否匹配(部分)字串,可以呼叫字串的 match() 方法:if (myString.match(/regex/)) { /*Success!*/ }。如果您想驗證使用者輸入,您應該使用 錨點 來確保您正在針對整個字串進行測試。若要測試使用者是否輸入數字,請使用:myString.match(/^\d+$/)/\d+/ 匹配任何包含一個或多個數字的字串,但 /^\d+$/ 僅匹配完全由數字組成的字串。

    若要使用正規表示式進行搜尋和取代,請使用字串的 replace() 方法:myString.replace(/replaceme/g, "replacement")。使用 /g 修飾詞可確保取代「replaceme」的所有出現。第二個參數是一個包含取代文字的常規字串。

    使用字串的 split() 方法允許您使用正規表示式將字串分割成字串陣列,以確定字串被分割的位置。例如,myArray = myString.split(/,/) 將逗號分隔的清單分割成陣列。逗號本身不包含在產生的字串陣列中。

    如何使用 JavaScript RegExp 物件

    建立新 RegExp 物件最簡單的方式就是使用特殊的 regex 語法:myregexp = /regex/。如果正規表示式在字串中(例如使用者輸入),可以使用 RegExp 建構函式:myregexp = new RegExp(regexstring)。修飾詞可以指定為第二個參數:myregexp = new RegExp(regexstring, "gim")

    建議不要對文字字串使用 RegExp 建構函式,因為在文字字串中,反斜線必須加上跳脫字元。正規表示式 \w+ 可以建立為 re = /\w+/re = new RegExp("\\w+")。後者絕對比較難讀。正規表示式 \\ 符合單一反斜線。在 JavaScript 中,這會變成 re = /\\/re = new RegExp("\\\\")

    不論用哪種方式建立「myregexp」,都可以傳遞給上面說明的 String 方法,而不是文字正規表示式:myString.replace(myregexp, "replacement")

    如果您想要擷取符合字串的部分,請呼叫您建立的 RegExp 物件的 exec() 函式,例如:mymatch = myregexp.exec("subject")。此函式會傳回陣列。陣列中的第零個項目會保留符合正規表示式的文字。後面的項目會包含符合 regexp 中 擷取括號 的文字(如果有的話)。mymatch.length 表示 match[] 陣列的長度,比正規表示式中的擷取群組數量多一個。mymatch.index 表示正規表示式符合的主題字串中的字元位置。mymatch.input 會保留主題字串的副本。

    呼叫 exec() 函式也會變更 RegExp 物件的 lastIndex 屬性。它會儲存主題字串中下一次符合嘗試會開始的索引。您可以修改此值,以變更下一次呼叫 exec() 的起始位置。

    RegExp 物件的 test() 函式是 exec() != null 的捷徑。它會將主題字串視為參數,並根據 regex 是否符合字串的一部分,傳回 true 或 false。

    您也可以對文字正規表示式呼叫這些方法。/\d/.test(subject) 是快速測試主題字串中是否有數字的方法。

    替換文字語法

    String.replace() 函式會詮釋替換文字字串中的幾個佔位符。如果 regexp 包含 擷取群組,您可以在替換文字中使用 反向參照$1 在替換文字中會插入符合第一個擷取群組的文字,$2 是第二個,以此類推,直到 $99。如果您的 regex 有 1 個以上但少於 10 個擷取群組,那麼 $10 會視為對第一個群組的反向參照,後面接著文字 0。如果您的 regex 有少於 7 個擷取群組,那麼 $7 會視為文字 $7$& 會重新插入整個 regex 符合項。$`(反引號)會插入 regex 符合項左邊的文字,$'(單引號)會插入 regex 符合項右邊的文字。$$ 會插入單一美元符號,任何未形成此處說明的佔位符之一的 $ 也是如此。

    $_$+ 雖然不是標準的一部分,但仍受到一些瀏覽器的支援。在 Internet Explorer 中,$_ 會插入整個主旨字串。在 Internet Explorer 和 Firefox 中,$+ 會插入與正規表示式中編號最高的擷取群組相符的文字。如果編號最高的群組沒有參與比對,$+ 會被替換為空白。這與 Perl 中的 $+ 不同,後者會插入與實際參與比對的編號最高的擷取群組相符的文字。

    雖然像 $& 之類的東西在 Perl 中實際上是可以在任何地方運作的變數,但在 JavaScript 中,它們只存在於傳遞給 replace() 函式的替換字串中的佔位符。

    在您的網路瀏覽器中測試 JavaScript 的 RegExp 支援

    我建立了一個 範例網頁,展示 JavaScript 的正規表示式支援 的實際運作。您現在可以在您的網路瀏覽器中試用看看。原始碼顯示在範例下方。

    | 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |

    | grep | PowerGREP | RegexBuddy | RegexMagic |

    | EditPad Lite | EditPad Pro |

    | Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery 和 XPath | XRegExp |

    | MySQL | Oracle | PostgreSQL |