这个documentation关于星号量词的说明:
Matches the preceding character 0 or more times.
它的工作原理如下:
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 次或多次”,但在第二个示例中却不会?
最佳答案
var regex = /r*/;
var str = "rodriguez";
正则表达式引擎将首先尝试从左到右匹配 rodriguez
中的 r
,并且由于存在匹配,因此它会消耗该匹配。
然后,正则表达式引擎尝试匹配另一个 r
,但下一个字符是 o
,因此它停在那里。
如果没有全局标志g
(如var regex =/r*/g;
使用),一旦正则表达式出现,正则表达式引擎将停止寻找更多匹配项。满意。
尝试使用:
var regex = /a*/;
var str = "cabbage";
尽管字符串中有 a
,但匹配结果将是一个空字符串!这是因为,正则表达式引擎首先尝试从左到右在 cabbage
中查找 a
,但第一个字符是 c
。由于这不匹配,因此正则表达式尝试匹配 0 次。至此,正则表达式满足,匹配到此结束。
可能值得指出的是 *
本身是贪婪的,这意味着它会首先尝试匹配尽可能多的内容(描述中的“或更多”部分),然后再尝试匹配 0次。
要从 rodriguez
获取所有 r
,您将需要前面提到的全局标志:
var regex = /r*/g;
var str = "rodriguez";
您将获得所有 r
以及其中的所有空字符串,因为 *
也匹配“nothing”。
关于javascript - 带星号量词的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20922143/