为什么这个正则表达式将空字符串放入匹配数组的开头和结尾?
var s = "1111abcd2222";
var re = /(\d+)([a-z]*?)(\d+)/g;
console.log(s.split(re)); //=>"", "1", "abcd", "2222", ""]
我认为+
操作员会避免空字符串匹配,因为它至少需要一个字符。
为什么这个正则表达式将空字符串放入匹配数组的开头和结尾?
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"]