首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-11-23 
闲得蛋疼玩String.prototype.split方法JavaScript中字符串的split方法大家经常用吧?例如将逗号分隔的字符

闲得蛋疼玩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   楼主强大 正则很头疼 !

热点排行