这个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次或更多次”,而不是在第二个例子中?
答案 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
与全局切换一起使用。