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

Javascript 带星号量词的正则表达式,javascript,regex,Javascript,Regex,这说明了星号量词: 与前面的字符匹配0次或多次 它的工作原理如下: var regex=/; var str=“”; console.log(str.match(regex)); 上面的结果是: 但是,当在下面的代码中尝试获取下面字符串中的所有“r”时,它只返回第一个“r”。为什么会这样 var regex = /r*/; var str = "rodriguez"; console.log(str.match(regex)); 为什么在第一个示例中,它会导致“前一个”字符/标记重复“0次或

这说明了星号量词:

与前面的字符匹配0次或多次

它的工作原理如下:

var regex=/;
var str=“”;
console.log(str.match(regex));
上面的结果是:

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

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

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

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

var regex = /r+/g;
在其他正则表达式中:

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

您正在匹配文本
使用全局开关匹配字符串中任意位置的1个或多个r:

var regex = /r+/g;
在其他正则表达式中:

var regex = /<[A-Za-z][A-Za-z0-9]*>/;
var regex=/;
您正在匹配文本

正则表达式引擎将首先尝试从左到右匹配
rodriguez
中的
r
,由于存在匹配,它将使用此匹配

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

如果没有全局标志
g
(用作so
var regex=/r*/g;
),一旦正则表达式满足要求,正则表达式引擎将停止查找更多匹配项

尝试使用:

var regex = /a*/;
var str = "cabbage";
匹配将是一个空字符串,尽管字符串中有
a
s!这是因为首先,正则表达式引擎尝试从左到右在
colla
中查找
a
,但第一个字符是
c
。由于不匹配,正则表达式尝试匹配0次。因此,正则表达式得到满足,匹配到此结束

可能值得指出的是,
*
单独是贪婪的,这意味着它将首先尝试匹配尽可能多的部分(描述中的“或更多”部分),然后再尝试匹配0次

要从
rodriguez
获取所有
r
,您需要前面提到的全局标志:

var regex = /r*/g;
var str = "rodriguez";
您将获得所有的
r
,以及其中的所有空字符串,因为
*
也匹配“nothing”

正则表达式引擎将首先尝试从左到右匹配
rodriguez
中的
r
,由于存在匹配,它将使用此匹配

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

如果没有全局标志
g
(用作so
var regex=/r*/g;
),一旦正则表达式满足要求,正则表达式引擎将停止查找更多匹配项

尝试使用:

var regex = /a*/;
var str = "cabbage";
匹配将是一个空字符串,尽管字符串中有
a
s!这是因为首先,正则表达式引擎尝试从左到右在
colla
中查找
a
,但第一个字符是
c
。由于不匹配,正则表达式尝试匹配0次。因此,正则表达式得到满足,匹配到此结束

可能值得指出的是,
*
单独是贪婪的,这意味着它将首先尝试匹配尽可能多的部分(描述中的“或更多”部分),然后再尝试匹配0次

要从
rodriguez
获取所有
r
,您需要前面提到的全局标志:

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

您将获得所有的
r
,以及其中的所有空字符串,因为
*
也与“nothing”匹配。

谢谢。除了你提供的“如何”之外,你能解释一下“为什么”吗。
*
的意思是“保持匹配直到它不正确”,正如
g
lobal标志的意思是“在我们找到匹配后,开始寻找第二个匹配,然后是第三个匹配,等等”@robertrocha:检查我更新的答案以获得解释。当[a-z]*用于“rodriguez”时它返回整个字符串。即使“r”有几个重复。这是否意味着在*找到其第一个匹配项后,引擎是否会将自身重置为“a”并再次搜索,直到它针对下一个字符到达“z”?当您使用
[a-z]*
时,它表示a到z范围内的任何字符中有0个或更多个。这将与
abcde-123
中的
abcde
匹配,但
/^r*/
表示0个或更多的字母
r
。如果输入为
rrrrrrr-987
它将匹配
rrrrr
,但不在
rarbrrdr-987
中,因为
r
字母不连续。谢谢。除了你提供的“如何”之外,你能解释一下“为什么”吗。
*
的意思是“保持匹配直到它不正确”,正如
g
lobal标志的意思是“在我们找到匹配后,开始寻找第二个匹配,然后是第三个匹配,等等”@robertrocha:检查我更新的答案以获得解释。当[a-z]*用于“rodriguez”时它返回整个字符串。即使“r”有几个重复。这是否意味着在*找到其第一个匹配项后,引擎是否会将自身重置为“a”并再次搜索,直到它针对下一个字符到达“z”?当您使用
[a-z]*
时,它表示a到z范围内的任何字符中有0个或更多个。这将与
abcde-123
中的
abcde
匹配,但
/^r*/
表示0个或更多的字母
r
。如果输入是
rrrrrrr-987
,它将匹配
rrrrr
,但不在
rarbrrdr-987
中,因为
r
字母不连续。谢谢,我现在理解了背后的逻辑。谢谢,我现在理解了背后的逻辑。