为什么使用+仍然匹配一个空字符串

时间:2013-10-04 16:00:05

标签: javascript regex

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

var s = "1111abcd2222";

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

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

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

2 个答案:

答案 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"]