javascript - 带星号量词的正则表达式

标签 javascript regex

这个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/

相关文章:

javascript - 试图刷新特定的 Canvas 元素

javascript - JQuery $.ajax 302 仅在第一次调用时重定向

javascript - 使用 Javascript Regex 将字符换行到字符串中,不包括链接标签

多行电子邮件地址的正则表达式?

javascript - 如何使用正则表达式忽略字符串替换中的某些单词

javascript - 返回时无法从 promise 中获取值(value)

javascript - 如何使 HTML 页面保持事件状态

regex - 模式匹配时是否可以使非捕获组在 Scala 正则表达式中工作

Python,循环文件的最佳方式,匹配模式后的两行然后加入它们

sql-server - 如何在SQL Server中获取与正则表达式匹配的部分字符串