RegExp.prototype.exec() - JavaScript 编辑
exec()
方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null
。
在设置了 global
或 sticky
标志位的情况下(如 /foo/g
or /foo/y
),JavaScript RegExp
对象是有状态的。他们会将上次成功匹配后的位置记录在 lastIndex
属性中。使用此特性,exec()
可用来对单个字符串中的多次匹配结果进行逐条的遍历(包括捕获到的匹配),而相比之下, String.prototype.match()
只会返回匹配到的结果。
如果你只是为了判断是否匹配(true或 false),可以使用 RegExp.test()
方法,或者 String.search()
方法。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
语法
regexObj.exec(str)
参数
str
- 要匹配正则表达式的字符串。
返回值
如果匹配成功,exec()
方法返回一个数组(包含额外的属性 index
和 input
,参见下方表格),并更新正则表达式对象的 lastIndex
属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应正则表达式内捕获括号里匹配成功的文本。
如果匹配失败,exec()
方法返回 null
,并将 lastIndex
重置为 0 。
描述
考虑以下示例:
// Match "quick brown" followed by "jumps", ignoring characters in between
// Remember "brown" and "jumps"
// Ignore case
var re = /quick\s(brown).+?(jumps)/ig;
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
下表列出这个脚本的返回值:
对象 | 属性/索引 | 描述 | 例子 |
result | [0] | 匹配的全部字符串 | Quick Brown Fox Jumps |
[1], ...[n ] | 括号中的分组捕获 | [1] = Brown | |
index | 匹配到的字符位于原始字符串的基于0的索引值 | 4 | |
input | 原始字符串 | The Quick Brown Fox Jumps Over The Lazy Dog | |
re | lastIndex | 下一次匹配开始的位置 | 25 |
ignoreCase | 是否使用了 "i " 标记使正则匹配忽略大小写 | true | |
global | 是否使用了 "g " 标记来进行全局的匹配. | true | |
multiline | 是否使用了 " | false | |
source | 正则匹配的字符串 | quick\s(brown).+?(jumps) |
示例
查找所有匹配
当正则表达式使用 "g
" 标志时,可以多次执行 exec
方法来查找同一个字符串中的成功匹配。当你这样做时,查找将从正则表达式的 lastIndex
属性指定的位置开始。(test()
也会更新 lastIndex
属性)。注意,即使再次查找的字符串不是原查找字符串时,lastIndex
也不会被重置,它依旧会从记录的 lastIndex
开始。
例如,你使用下面的脚本:
var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
var msg = 'Found ' + myArray[0] + '. ';
msg += 'Next match starts at ' + myRe.lastIndex;
console.log(msg);
}
脚本运行结果如下:
Found abb. Next match starts at 3 Found ab. Next match starts at 9
注意:不要把正则表达式字面量(或者RegExp
构造器)放在 while
条件表达式里。由于每次迭代时 lastIndex
的属性都被重置,如果匹配,将会造成一个死循环。并且要确保使用了'g'标记来进行全局的匹配,否则同样会造成死循环。
结合 RegExp 字面量使用 exec()
你也可以直接使用 exec()
而不是创建一个 RegExp
对象:
var matches = /(hello \S+)/.exec('This is a hello world!');
console.log(matches[1]);
运行上面的代码,控制台会输出"hello world!" 字符串。
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 3rd Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.2. |
ECMAScript 5.1 (ECMA-262) RegExp.exec | Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) RegExp.exec | Standard | |
ECMAScript (ECMA-262) RegExp.exec | Living Standard |
浏览器兼容性
BCD tables only load in the browser
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.相关链接
- Regular Expressions chapter in the JavaScript Guide
RegExp
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论