Javascript 为什么使用+;仍然匹配空字符串

Javascript 为什么使用+;仍然匹配空字符串,javascript,regex,Javascript,Regex,为什么这个正则表达式将空字符串放在matches数组的开头和结尾 var s = "1111abcd2222"; var re = /(\d+)([a-z]*?)(\d+)/g; console.log(s.split(re)); //=>"", "1", "abcd", "2222", ""] 我认为+运算符会避免空字符串匹配,因为它至少需要一个字符。您缺少开始和结束指示器: var re = /^(\d+)([a-z]*?)(\d+)$/g; // ^- star

为什么这个正则表达式将空字符串放在matches数组的开头和结尾

var s = "1111abcd2222";

var re = /(\d+)([a-z]*?)(\d+)/g;

console.log(s.split(re)); //=>"", "1", "abcd", "2222", ""] 

我认为
+
运算符会避免空字符串匹配,因为它至少需要一个字符。

您缺少开始和结束指示器:

var re = /^(\d+)([a-z]*?)(\d+)$/g;
//        ^- start            ^ -end
字符串
aa1bb
可以通过
/([a-z]+)\d([a-z]+)/
匹配,就像
a1b
一样,因为它不必贪婪。如果您使用
/^([a-z]+)\d([a-z]+)$/
则表明它必须在开始时开始匹配,并在结束时停止,因此它将匹配
aa1bb
给出
[“aa1bb”、“aa”、“bb”]

由于使用的是
split
,因此在开始和结束处都会出现空字符串

"aaa".split(/a/); // [ "", "", "", "" ]
"abab".split(/(ab)/); // [ "", "ab", "", "ab", "" ]

您应该在此处使用
String#match
而不是
String#split

但是,如果确实要使用split,则以下基于负前瞻的正则表达式将避免出现空结果:

re = /(?!^)(\d+)([a-z]*?)(\d+)(?!$)/g;
//=> ["1", "111", "abcd", "222", "2"]

因为您使用了
split
而不是
match
/^(\d+)([a-z]*?)(\d+)$/
在匹配我的问题中的字符串时,仍然在末尾给我空字符串。但是,您使用的是
split
,这是完全匹配,因此其他部分都是空的。类似于
“aaa”。split(“a”)
为您提供4个空字符串。