歧义的正则替换
emu 2003-05-22 11:39:19 要用一个正则将一个串中的单一个的数字改为两位的0?格式,在IE中不难:
s="1/01/2/3/4/04/5";
s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$10$2");
alert(s);
可是这样做在netScape6.0中就不行了,虽然根本不存在第10个匹配,netScape还是把$10看成是第10个匹配而不是第一个匹配加上“0”。
换种表达来避免歧义?
s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1\x30$2");
$1\x30$2居然也会被认为是$10$2!
那就试试把预查往前挪来避免歧义:
s = s.replace(/(?=\D|^)(\d)(\D|$)/g,"0$1$2");
结果不对啊?看看匹配结果:
s = s.match(/(?=\D)(\d)/g);
正向预查放到前面的时候根本不能匹配
用非存储匹配,又会丢失字符:
s = s.replace(/(?:^|\D)(\d)(\D|$)/g,"0$1$2");
怎么办?
暂时只能用两个正则先顶着:
s = s.replace(/(^|\D)(\d)(?=\D|$)/g,"$1~$2").replace(/~/g,"0");
但是觉得不甘心,难道就没有办法用一个没有歧义的正则来完成这个功能吗?期待高手……