根据MDN
x* : *Matches the preceding item x 0 or more times.*
基本上前面的字符应该是完全可选的。无论字符串是否存在,都将匹配该字符串。那么为什么呢:
1
var text = "foobar";
var re = /q*/;
var found = text.match(re);
console.log(found); // prints '["", index: 0, input: "foobar"]'
但是
var re = /qz*/;
console.log(found); // prints 'null'
这两个表达式同样不存在,因此应匹配0次'""'应该退还。
或者:
2
var re = /fz*/;
console.log(found); // prints '["f", index: 0, input: "foobar"]'
但
var re = /fzq*/;
console.log(found); // prints 'null'
这里发生了什么?根据我的理解,'fzq'
不存在,因此应该匹配0次,并且'""'应该退货吧?如果它以某种方式匹配每个字符而不是整个字符串,'fzq*'
应返回与'fz'
相同的结果 - 'f'
匹配一次,其余匹配0次。但显然这不是发生的事情。
有人能说清楚这里到底发生了什么吗?
答案 0 :(得分:2)
x *:匹配前面的项目x 0次或更多次。
在*
匹配零次或多次之前,您误解了所有的语句。
当您匹配q*
时,正则表达式将在输入字符串中搜索q
。由于q
中没有foobar
,它会返回一个空字符串。
当您尝试匹配qz*
时,正则表达式会尝试在z
之后搜索任意数量的q
。由于输入字符串中没有q
,因此它会返回null
。
要按*
或任何其他量词匹配更多字符,您需要使用括号对它们进行分组。
(qz)*
表示匹配字符串qz
零次或多次。
要了解正则表达式,您可以使用https://regex101.com/网站。