Javascript JS替换为正则表达式

Javascript JS替换为正则表达式,javascript,regex,Javascript,Regex,需要一个正则表达式。如果我想用“PPP”代替“abcdf” XabcdfX是xxxxxxx。有xxxxx。abcdf是xxxxxxx。zxabcdf abcdf。 然后是预期的产出 XPPPX is xxxxxxx. <MabcdfM> has xxxxx. PPP is xxxxxxx. <FabcdfF> zxPPP PPP. XPPPX是xxxxxxx。有xxxxx。购买力平价为xxxxxxx。zxPPP PPP。 abcdf可以是整个字符串,甚至可以是子字符

需要一个正则表达式。如果我想用“PPP”代替“abcdf”

XabcdfX是xxxxxxx。有xxxxx。abcdf是xxxxxxx。zxabcdf abcdf。
然后是预期的产出

XPPPX is xxxxxxx. <MabcdfM> has xxxxx. PPP is xxxxxxx. <FabcdfF> zxPPP PPP.
XPPPX是xxxxxxx。有xxxxx。购买力平价为xxxxxxx。zxPPP PPP。
abcdf可以是整个字符串,甚至可以是子字符串。它将只是字母数字。只有当它不在<>之间时才能更换

我需要使用javascript替换方法来完成。请帮帮我

您可以使用:

s=s.replace(/abcdf|(]*>)/g,函数(g0,g1){返回g1?g1:'PPP';});
工作示例:

显然,如果您有嵌套或不匹配的尖括号对,则此操作将失败。

您可以使用:

s=s.replace(/abcdf|(]*>)/g,函数(g0,g1){返回g1?g1:'PPP';});
工作示例:


显然,如果有嵌套的或不匹配的尖括号对,则此操作将失败。

如果可以确定没有类似>,我将迭代使用indexOf函数,而不是使用正则表达式:

index = string.indexOf("<", lastIndex);
index = string.indexOf(">", index);
index = string.indexOf("abcd", index);
string = string.substring(0, index)+"PPP"+string.substring(index+4);
index=string.indexOf(“,index);
index=string.indexOf(“abcd”,index);
string=string.substring(0,索引)+“PPP”+string.substring(索引+4);

如果您可以确定,没有什么比>,我将迭代使用indexOf函数,而不是使用正则表达式:

index = string.indexOf("<", lastIndex);
index = string.indexOf(">", index);
index = string.indexOf("abcd", index);
string = string.substring(0, index)+"PPP"+string.substring(index+4);
index=string.indexOf(“,index);
index=string.indexOf(“abcd”,index);
string=string.substring(0,索引)+“PPP”+string.substring(索引+4);
假设您的“标记”不能嵌套,您可以使用前瞻断言:

s.replace(/abcdf(?=[^<>]*(<|$))/g, "PPP")
s.replace(/abcdf(?=[^]*(假设您的“标记”不能嵌套,您可以使用前瞻断言:

s.replace(/abcdf(?=[^<>]*(<|$))/g, "PPP")
s.replace(/abcdf(?=[^]*(
var collect=function,s,re)
{
var rv=[];
对于(var m;m=re.exec;rv.push(m));
返回rv;
}
var s=“XabcdfX是xxxxxxx。has xxxxx。abcdf是xxxxxxx。zxabcdf abcdf。”
var tags=collect(s,/]*>/g);
var匹配=收集(s,/abcdf/g);
日志(“输入:”,s)
var r=s
匹配:for(变量i=0,j=0;imend)
继续比赛
如果(tbeg>mbeg)
断开标签
}
r=r.substr(0,mbeg)+m[0]。toUpperCase()+r.substr(mbeg+m[0]。长度)
}
日志(“结果:”,r)
var collect=函数(s,re)
{
var rv=[];
对于(var m;m=re.exec;rv.push(m));
返回rv;
}
var s=“XabcdfX是xxxxxxx。has xxxxx。abcdf是xxxxxxx。zxabcdf abcdf。”
var tags=collect(s,/]*>/g);
var匹配=收集(s,/abcdf/g);
日志(“输入:”,s)
var r=s
匹配:for(变量i=0,j=0;imend)
继续比赛
如果(tbeg>mbeg)
断开标签
}
r=r.substr(0,mbeg)+m[0]。toUpperCase()+r.substr(mbeg+m[0]。长度)
}
日志(“结果:”,r)

这个问题没有任何意义。与Switz不同,我认为这个问题非常清楚,但我想看看您到目前为止都尝试了什么。另外,如果输入字符串有类似“数字3<5.abcdf但6>2”的内容,该怎么办这个问题看起来像另一个问题:这个问题没有任何意义。与Switz不同,我认为这个问题非常清楚,但我想看看您到目前为止尝试了什么。另外,如果输入字符串有类似“数字3<5.abcdf但6>2”的内容,该怎么办。这个问题看起来像另一个问题:
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)