JS用正则表达式替换

时间:2011-11-23 10:44:19

标签: javascript regex

需要正则表达式。如果我想在

中将“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替换方法。请帮我。

4 个答案:

答案 0 :(得分:3)

您可以使用callback to replace

执行此操作
s = s.replace(/abcdf|(<[^>]*>)/g, function(g0,g1){return g1 ? g1: 'PPP';});

工作示例:http://jsbin.com/abakax

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

答案 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)