首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RegExp的exec()函数和String的match()函数有什么不同?

RegExp的exec()函数和String的match()函数有什么不同?
EN

Stack Overflow用户
提问于 2012-02-10 00:28:15
回答 3查看 52.8K关注 0票数 133

如果我运行以下命令:

代码语言:javascript
复制
/([^\/]+)+/g.exec('/a/b/c/d');

我明白了:

代码语言:javascript
复制
["a", "a"]

但是如果我运行这个:

代码语言:javascript
复制
'/a/b/c/d'.match(/([^\/]+)+/g);

然后我得到了预期的结果:

代码语言:javascript
复制
["a", "b", "c", "d"]

有什么关系呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-10 00:31:06

带有全局正则表达式的exec将在循环中使用,因为它仍将检索所有匹配的子表达式。所以:

代码语言:javascript
复制
var re = /[^\/]+/g;
var match;

while (match = re.exec('/a/b/c/d')) {
    // match is now the next match, in array form.
}

// No more matches.

String.match会为您执行此操作,并丢弃捕获的组。

票数 124
EN

Stack Overflow用户

发布于 2012-02-10 00:31:51

/regex/.exec()仅返回找到的第一个匹配项,而如果在正则表达式中使用g标志,则"string".match()将返回所有匹配项。

请看这里:execmatch

票数 30
EN

Stack Overflow用户

发布于 2015-10-15 12:18:17

如果您的正则表达式是全局的,并且您正在捕获,那么您必须使用exec。Match不会返回所有捕获的内容。

匹配适用于仅匹配(而不是捕获)的情况。只要运行一次,它就会给出一个包含所有匹配项的数组。(不过,如果正则表达式不是全局的,那么match将显示匹配,后跟捕获)

Exec是您在捕获时使用的,每次执行它都会提供匹配,然后是捕获。(只有当正则表达式不是全局的时,match的行为方式是先进行完全匹配,然后进行捕获)。

Exec的另一个用途是获取匹配的索引或位置。当您的正则表达式有一个变量时,您可以使用.lastIndex并获取匹配的位置。正则表达式对象具有.lastIndex,而正则表达式对象是您在其上执行.exec操作的对象。点匹配是在字符串上完成的,然后您将无法执行正则表达式对象点lastIndex

字符串,具有匹配函数,该函数被传递给一个正则表达式。和一个regex,具有exec函数,并被传递一个字符串

exec你运行了多次。匹配你运行一次

在不捕获时使用match是很好的,在捕获时您可以使用exec,它更强大,因为它有利于获取捕获,但如果您在捕获时使用了match,请注意当正则表达式不是全局时,它会显示捕获,但当正则表达式是全局时,它不会显示捕获。

代码语言:javascript
复制
> "azb".match(/a(z)b/);
[ "azb", "z" ]

> "azb".match(/a(z)b/g);
[ "azb" ]
>

另一件事是,如果您使用exec,请注意,这是在regex上调用的,如果您为regex使用了一个变量,那么您将拥有更大的能力

如果不将变量用于regex,则不会获得匹配结果,因此在使用exec时,请使用regex的变量

代码语言:javascript
复制
> /./g.exec("abc")
[ "a" ]
> /./g.exec("abc")
[ "a" ]
> /./g.exec("abc")
[ "a" ]
>
> /[a-c]/g.exec("abc")
[ "a" ]
> /[a-c]/g.exec("abc")
[ "a" ]
>

> var r=/[a-c]/g
> r.exec("abc")
[ "a" ]
> r.exec("abc")
[ "b" ]
> r.exec("abc")
[ "c" ]
> r.exec("abc")
null
>

使用exec,您可以获得匹配的“索引”。

代码语言:javascript
复制
> var r=/T/g
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
2
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
6
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
9
> r.exec("qTqqqTqqTq");
null
> r.lastIndex
0
>

因此,如果你想要索引或捕获,那么使用exec (请记住,正如你所看到的,对于“索引”,它给出的“索引”实际上是第n次出现,它是从1开始计数的。所以你可以通过减去1得到正确的索引。正如你可以看到的那样,它给出了0- lastIndex为0-表示找不到)。

如果你想伸展匹配,你可以在捕获的时候使用它,但是当正则表达式是全局的,当你这样做的时候,数组的内容并不是所有的匹配,而是完全匹配,后面跟着捕获。

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9214754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档