JS 正则表达式利用前瞻格式化字符串(不支持后瞻)

2021-12-31 11:04:17 [大杂烩 - PC与手机]
在应用中比如日期等,一串字符中数字中要凑足2位或3位等,不够的加前导0。

比如,将数字凑2位:
例1  document.write("1,2,3,4,10,11,8,9".replace(/(^\D)(\d)(\D$)/gi,"$10$2$3"));
结果 01,2,03,4,10,11,08,9
  不成功。没有使用前瞻,由于定界符被占用,导致部分没有替换

 例2  document.write("1,2,3,4,10,11,8,9".replace(/(\d)(?!\d)/gi,"0$1"));
结果 01,02,03,04,100,101,08,09
   不成功。数字前不加定界符,导致本身有2位的也加了

例3  document.write("1,2,3,4,10,11,8,9".replace(/(^\D)(\d)(?!\d)/gi,"$10$2"));
结果 01,02,03,04,10,11,08,09
正确,用负向前瞻,匹配了结尾符 


例4 document.write("1,2,3,4,10,11,8,9".replace(/(^\D)(\d)(?=(?:\D$))/gi,"$10$2"));

结果 01,02,03,04,10,11,08,09 
正确,用正向前瞻,并不匹配结尾符,所以要加上$


附注:
JS 不支持后瞻,故不能用 (?<!\d) 和 (?<=\d) 放在开头,来匹配以某格式开头其后的字符。
但可以用前瞻处理部分问题,比如:汽车车牌除第一个字符是中文外,其他的地方必须是数字和字母,可用以下办法剔除

document.write("鄂A-D1乱2345".replace(/(?!^)([^0-9A-Z])/gi,"");

结果 鄂A-D12345