需要正则表达式。如果我想在
中将“abcdf”替换为“PPP”XabcdfX is xxxxxxx. <MabcdfM> has xxxxx. abcdf is xxxxxxx. <FabcdfF> zxabcdf abcdf.
然后是预期的输出
XPPPX is xxxxxxx. <MabcdfM> has xxxxx. PPP is xxxxxxx. <FabcdfF> zxPPP PPP.
abcdf可以是整个字符串,甚至可以是子字符串。它只是字母数字。它只能在不介于&lt;之间时才能更换。 &GT;
我需要使用javascript替换方法。请帮我。
答案 0 :(得分:3)
您可以使用callback to replace
:
s = s.replace(/abcdf|(<[^>]*>)/g, function(g0,g1){return g1 ? g1: 'PPP';});
显然,如果您有嵌套或不匹配的尖括号对,则会失败。
答案 1 :(得分:1)
假设您的“标签”无法嵌套,您可以使用先行断言:
s.replace(/abcdf(?=[^<>]*(<|$))/g, "PPP")
答案 2 :(得分:0)
如果你可以肯定,没有像&gt;,我会迭代地使用indexOf函数而不是使用正则表达式:
index = string.indexOf("<", lastIndex);
index = string.indexOf(">", index);
index = string.indexOf("abcd", index);
string = string.substring(0, index)+"PPP"+string.substring(index+4);
答案 3 :(得分:0)
var collect = function (s, re)
{
var rv = [];
for (var m; m = re.exec(s); rv.push(m));
return rv;
}
var s = "XabcdfX is xxxxxxx. <MabcdfM> has xxxxx. abcdf is xxxxxxx. <FabcdfF> zxabcdf abcdf."
var tags = collect(s, /<[^>]*>/g);
var matches = collect(s, /abcdf/g);
console.log("INPUT:", s)
var r = s
MATCH: for (var i = 0, j = 0; i < matches.length; ++i) {
var m = matches[i]
var mbeg = m.index
var mend = mbeg + m[0].length
TAG: for (; j < tags.length; ++j) {
var t = tags[j]
var tbeg = t.index
var tend = tbeg + t[0].length
if (tend < mbeg)
continue TAG
if (tbeg < mbeg && tend > mend)
continue MATCH
if (tbeg > mbeg)
break TAG
}
r = r.substr(0, mbeg) + m[0].toUpperCase() + r.substr(mbeg + m[0].length)
}
console.log("RESULT:", r)