我的问题始于 -
var str='0|31|2|03|.....|4|2007'
str=str.replace(/[^|]\d*[^|]/,'5');
所以输出变得像:“0 | 5 | 2 | 03 | .... | 4 | 2007”所以它取代了31-> 5
但是当我改变这样的代码时,这对于替换其他段不起作用:
str=str.replace(/[^|]{2}\d*[^|]/,'6');
不会改变2-> 6。 实际上我在这里失踪了什么。有什么帮助吗?
答案 0 :(得分:3)
我认为正则表达式对于该问题来说是一个糟糕的解决方案。我宁愿做这样的事情:
var str = '0|31|2|03|4|2007';
var segments = str.split("|");
segments[1] = "35";
segments[2] = "123";
无法想出用正则表达式解决这个问题的好方法。
答案 1 :(得分:2)
首先,您不必在字符集中转义|
,因为它在字符集中没有任何特殊含义。
其次,您不要将量词放在字符集中。
最后,要创建全局匹配表达式,必须使用g
标志。
答案 2 :(得分:2)
[^ \ |]表示除“|”之外的任何内容,因此在您的情况下,它只匹配一个数字。因此它只会匹配2位或更多位数的任何内容。
其次你应该把{2}放在[] -brackets
之外我不确定你想在这里实现什么。
答案 3 :(得分:2)
以下是一个特定的正则表达式解决方案,它将第一个|
管道符号后面的数字替换为数字5
:
var re = /^((?:\d+\|){1})\d+/;
return text.replace(re, '$15');
如果您要替换第三个|
后面的数字,只需将正则表达式的{1}
部分更改为{3}
这是一个通用函数,它将用指定的新数字替换任何给定的数字槽(从零开始的索引):
function replaceNthNumber(text, n, newnum) {
var re = new RegExp("^((?:\\d+\\|){"+ n +'})\\d+');
return text.replace(re, '$1'+ newnum);
}