正则表达式工具 |
grep |
语言与程序库 |
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 |
本网站的更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序与语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
使用 JavaScript 的正则表达式
JavaScript 的正则表达式风格是 ECMA-262 语言标准的一部分。这表示您的正则表达式应可在所有 JavaScript 实作中以完全相同的方式运作。过去有许多严重的浏览器特定问题。但现代浏览器在遵循正则表达式的 JavaScript 标准方面做得很好。您只需要确定您的网页具有请求浏览器使用标准模式而非奇异模式的 DOCTYPE。
JavaScript 的正则表达式风格
在 JavaScript 原代码中,正则表达式以 /pattern/modifiers
的形式撰写,其中「pattern」是正则表达式本身,而「modifiers」是一系列表示各种选项的字符。「modifiers」部分是选用的。此语法取自 Perl。JavaScript 支持下列 modifiers,这是 Perl 支持的子集
/g
激活「全域」比对。使用replace()
方法时,指定此 modifiers 以取代所有比对,而不仅仅是第一个。/i
使正则表达式比对不区分大小写。/m
激活「多行模式」。在此模式中,插入符号和美元符号会比对主旨字符串中换行符号的前后。/s
激活「单行模式」。在此模式中,句点会比对换行符号。此 modifiers 在 ECMAScript 2018 中添加。较旧的浏览器,包括 Internet Explorer 和原始 Edge,不支持它。
您可以通过将多个 modifiers 串接在一起的方式来结合它们,例如 /regex/gim
。值得注意的是,没有选项可以 让句点比对换行符号字符。
由于正斜线用于分隔正则表达式,因此出现在正则表达式中的任何正斜线都需要进行转义。例如,正则表达式 1/2
在 JavaScript 中写作 /1\/2/
。
若要匹配不含 /s
的绝对任何字符,可以使用包含 字符类别 和其否定版本(例如 [\s\S]
)的 简写类别。
JavaScript 实作 Perl 风格的正则表达式。然而,它缺少 Perl 和其他现代正则表达式风格中相当多的高端功能。
- 没有 \A 或 \Z锚点 来匹配字符串的开头或结尾。请改用 插入符号或美元符号。
- 没有 原子组 或 占有量词。
- 没有 Unicode 支持,但可以通过
\uFFFF
匹配单一字符。 - 没有 命名捕获组。请改用 编号捕获组。
- 没有 模式修改器 来设置正则表达式中的匹配选项。
- 没有 条件。
- 没有 正则表达式注解。请改用 JavaScript
//
注解来描述正则表达式,并置于正则表达式字符串之外。
这些功能中的许多功能都可以在 JavaScript 的 XRegExp 函数库 中找到。
字符串类别的正则表达式方法
若要测试特定正则表达式是否匹配(部分)字符串,可以调用字符串的 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 的正则表达式支持 的实际运作。您现在可以在您的网络浏览器中试用看看。原代码显示在范例下方。