快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
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 对象的最简单方法是直接使用特殊正则表达式语法: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")。此函数返回一个数组。数组中的第零项将保存与正则表达式匹配的文本。如果正则表达式中存在 捕获括号,则后续项将包含与之匹配的文本。 mymatch.length 指示 match[] 数组的长度,该长度比正则表达式中的捕获组数多 1。 mymatch.index 指示正则表达式匹配的 subject 字符串中的字符位置。 mymatch.input 保留 subject 字符串的副本。

    调用 exec() 函数还会更改 RegExp 对象的 lastIndex 属性。它存储 subject 字符串中的索引,从该索引开始将进行下一次匹配尝试。您可以修改此值以更改对 exec() 的下一次调用的起始位置。

    RegExp 对象的 test() 函数是 exec() != null 的快捷方式。它将 subject 字符串作为参数,并根据正则表达式是否与字符串的一部分匹配返回 true 或 false。

    您也可以对文字正则表达式调用这些方法。 /\d/.test(subject) 是快速测试 subject 字符串中是否存在任何数字的方法。

    替换文本语法

    String.replace() 函数解释替换文本字符串中的几个占位符。如果正则表达式包含 捕获组,则可以在替换文本中使用 反向引用。替换文本中的 $1 插入与第一个捕获组匹配的文本,$2 插入第二个,依此类推,直到 $99。如果您的正则表达式有多于 1 个但少于 10 个捕获组,则 $10 将被视为对第一个组的反向引用,后跟一个文字零。如果您的正则表达式少于 7 个捕获组,则 $7 将被视为文字文本 $7$& 重新插入整个正则表达式匹配项。 $`(反引号)插入正则表达式匹配项左侧的文本,$'(单引号)插入正则表达式匹配项右侧的文本。 $$ 插入一个美元符号,任何不构成此处描述的占位符之一的 $ 也是如此。

    $_$+ 不是标准的一部分,但仍受到一些浏览器的支持。在 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 |