Javascript 为什么使用+;仍然匹配空字符串
为什么这个正则表达式将空字符串放在matches数组的开头和结尾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
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个空字符串。