中易网

JavaScript正则匹配,反向引用中的数字问题

答案:5  悬赏:0  
解决时间 2021-11-09 07:21
  • 提问者网友:饮鸿
  • 2021-11-08 15:00
在JavaScript中使用正则进行字符串替换时,可以使用‘$1’、'$2'来反向引用模式串中所匹配的分组,例如:
'#5'.replace(/(\d)/, 'a$1'),可得到'#a5'这样的结果,即源字符串中被分组‘(\d)’匹上的数字5,被替换成了‘a5’。

资料显示,JavaScript中,反向引用的数量最高到99,即可以有$1~$99。
当匹配中只存在10个以下分组时,'$10'会被解析为'$1'的反向引用后跟数字0;匹配项中的分组数量大于等于10时,'$10'才被解析为第10个分组的反向引用。

现在的问题是:如果存在10个以上分组,而替换的目标串想在第一个分组的反向引用后连缀数字0,如何让JavaScript正确处理此种情况:
'9876543210'.replace(/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)/, '$10abc');
上述语句执行的结果是‘0abc’,即JavaScript引擎将'$10'解析为对匹配项中第十个分组的反向引用,而实际的期望得到结果是'90abc',即'$10abc'被解析为'$1' + '0abc'。
在php中,可以通过'${1}0abc'的方式来解决,但JavaScript下并不支持此种写法。

如果不通过replace第二个参数使用回调的方式,有没有更自然的书写方式来达到目的?
最佳答案
  • 二级知识专家网友:废途浑身病态
  • 2021-11-08 15:41
其实方法很简单
利用一个转义字符'\'就解决了
要使用组1时写成'$1\0'
要使用组10时写成'$10'
因为数字转义后还是这个数字,也不用担心有什么后遗症,只是用来隔开数字
全部回答
  • 1楼网友:桃花别处起长歌
  • 2021-11-08 17:48
因为你的写法不对,正确的写法是 var reg = new regexp(/^\d{5}$/); //或者 var reg =/^\d{5}$/; 亲测可用~
  • 2楼网友:野心和家
  • 2021-11-08 17:20
'9876543210'.replace(/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)/, '$1\u00000abc'); \u0000是空字符 注意遵循ECMAScript规范。 最好用: var s = '9876543210'; if(/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)/.test(s)){ s =  RegExp.$1+'0abc'; }
  • 3楼网友:风格单纯
  • 2021-11-08 17:01
JS里应该没有其他方法了。只能用回调函数。
  • 4楼网友:而你却相形见绌
  • 2021-11-08 16:25
你可以试试 '9876543210'.replace(/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)/, '$1‘+’0abc‘);
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息