`
clue
  • 浏览: 30439 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

闲得蛋疼玩String.prototype.split方法

阅读更多
JavaScript中字符串的split方法大家经常用吧?例如将逗号分隔的字符串分解为数组:
"a,b,c".split(","); // ["a", "b", "c"]


split可以按正则表达式进行分解估计很多人也知道,常见的就是多浏览器通用的分解多行文本:
"a\nb\r\nc\rd".split(/\r?\n/); // 通吃IE和Opera的\r\n,以及FF、Chrome、Safari的\n


今天在写MAC字串处理的时候也用到了它,要处理的格式有4种:
01-23-45-67-89-ab
01:23:45:67:89:ab
0x0123456789ab
0123456789ab
前两种分解很容易:
"01-23-45-67-89-ab".split(/-|:/);


而对于后面的2种格式,突然也想用split进行拆分,该如何进行呢?来慢慢尝试
// 先试试2个2个匹配
"0123456789ab".split(/../); // ["", "", "", "", "", "", ""]
// 嗯。。。有问题,需要保留匹配项,加上括号分组
"0123456789ab".split(/(..)/);// ["", "01", "", "23", "", "45", "", "67", "", "89", "", "ab", ""]
// 前后的空字串也被分解了,看来不能从头开始匹配,用前置预匹配
"0123456789ab".split(/(?<=(?:..)(..))/); // SyntaxError: Invalid regular expression: /(?<=(?:..)(..))/: Invalid group
// 呃。。看来不支持前置预匹配,换后置的
"0123456789ab".split(/(?=(?:..)+)$/); // ["0123456789ab"]
// 嗯?完全没分解,哦,结束符被匹配上了,把它放到预匹配中去
"0123456789ab".split(/(?=(?:..)+$)/); // ["01", "23", "45", "67", "89", "ab"]
// :) 大功告成!


可以简单改造,使它支持其它数目分隔,例如IPv6的4位分隔:
"200100004136e378800063bf3ffffdd2".split(/(?=(?:.{4})+$)/);
// ["2001", "0000", "4136", "e378", "8000", "63bf", "3fff", "fdd2"]


但现在有个问题,它是以字符串结尾进行对齐的,所以会出现这种情况:
"200100004136e378800063bf3ffffd".split(/(?=(?:.{4})+$)/);
// ["20", "0100", "0041", "36e3", "7880", "0063", "bf3f", "fffd"]


有没有这样一个JS下的正则,可以实现与头对齐的拆分呢?
"200100004136e378800063bf3ffffd".split(__?__);
// ["2001", "0000", "4136", "e378", "8000", "63bf", "3fff", "fd"]


想不出来了,有解么?

P.S. 此拆分方法并不推荐使用,对于平整的拆分,它的性能明显不如按位循环。仅供蛋疼的时候玩……
分享到:
评论
1 楼 msdghs 2012-04-23  
楼主强大 正则很头疼 !

相关推荐

Global site tag (gtag.js) - Google Analytics