带有星号量词的正则表达式

时间:2014-01-04 14:22:46

标签: javascript regex

这个documentation说明了星号量词:​​

  

匹配前面的字符0次或更多次。

它的作用类似于:

var regex = /<[A-Za-z][A-Za-z0-9]*>/;
var str = "<html>";
console.log(str.match(regex));

以上结果是:<html>

但是当尝试使用以下代码获取下面字符串中的所有“r”时,它只返回第一个“r”。这是为什么?

var regex = /r*/;
var str = "rodriguez";
console.log(str.match(regex));

为什么在第一个例子中它会导致“前面的”字符/标记重复“0次或更多次”,而不是在第二个例子中?

2 个答案:

答案 0 :(得分:4)

var regex = /r*/;
var str = "rodriguez";

正则表达式引擎会首先尝试从左到右匹配r中的rodriguez,因为匹配,就会消耗此匹配。

然后,正则表达式引擎尝试匹配另一个r,但下一个字符为o,因此它会停在那里。

如果没有全局标记g(用作var regex = /r*/g;),正则表达式引擎将在正则表达式满足后停止查找更多匹配项。

尝试使用:

var regex = /a*/;
var str = "cabbage";

尽管字符串中有a个,但匹配将是一个空字符串!这是因为首先,正则表达式引擎尝试从左到右查找a中的cabbage,但第一个字符是c。由于这不匹配,正则表达式尝试匹配0次。因此满足正则表达式并且匹配在此结束。

可能值得指出的是*单独是贪婪的,这意味着它会在尝试匹配0次之前首先尝试匹配尽可能多的(描述中的“或更多”部分)。 / p>

要从r获取所有rodriguez,您需要如前所述的全局标记:

var regex = /r*/g;
var str = "rodriguez";

你将获得所有r以及所有空字符串,因为*也匹配'nothing'。

答案 1 :(得分:1)

使用全局开关在字符串中的任何位置匹配1个或多个r:

var regex = /r+/g;

在你的其他正则表达式中:

var regex = /<[A-Za-z][A-Za-z0-9]*>/;

您匹配文字<后跟一个字母后跟0或更多字母或数字,它将与<html>

完全匹配

但如果您输入的内容为<foo>:<bar>:<abc>,那么它只会匹配<foo>而非其他细分受众群。要匹配所有细分,您需要将/<[A-Za-z][A-Za-z0-9]*>/g与全局切换一起使用。