为什么这个正则表达式将空字符串放入匹配数组的开头和结尾?
var s = "1111abcd2222";
var re = /(\d+)([a-z]*?)(\d+)/g;
console.log(s.split(re)); //=>"", "1", "abcd", "2222", ""]
我认为+
运算符会避免空字符串匹配,因为它至少需要一个字符。
答案 0 :(得分:2)
您错过了开始和结束指示符:
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", "" ]
答案 1 :(得分:0)
您应该在这里使用String#match
代替String#split
。
但是,如果您确实想使用拆分,那么基于负前瞻的正则表达式将避免空结果:
re = /(?!^)(\d+)([a-z]*?)(\d+)(?!$)/g;
//=> ["1", "111", "abcd", "222", "2"]