0

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

var s = "1111abcd2222";

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

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

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

4

2 回答 2

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", "" ]
于 2013-10-04T16:01:06.920 回答
0

你应该使用String#match而不是在String#split这里。

但是,如果您确实想使用 split 然后遵循基于负前瞻的正则表达式将避免空结果:

re = /(?!^)(\d+)([a-z]*?)(\d+)(?!$)/g;
//=> ["1", "111", "abcd", "222", "2"]
于 2013-10-04T16:06:55.487 回答