2011-11-23 113 views
1

更换需要一个正则表达式。如果我想在JS正则表达式

XabcdfX is xxxxxxx. <MabcdfM> has xxxxx. abcdf is xxxxxxx. <FabcdfF> zxabcdf abcdf. 

那么预期输出以“购买力平价”来代替“ABCDF”

XPPPX is xxxxxxx. <MabcdfM> has xxxxx. PPP is xxxxxxx. <FabcdfF> zxPPP PPP. 

ABCDF可以是整个字符串,甚至可以是一个字符串。它将只有字母数字。当它不<之间来它只能更换>。

我需要使用javascript替代方法来做到这一点。请帮帮我。

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

工作实例:

+0

这个问题让零感。 – switz

+2

不像士瑞兹我认为这个问题是很清楚,但我想看看到目前为止你已经尝试了什么。此外,如果什么输入字符串具有类似“数3 <5 ABCDF但是6> 2”。 – nnnnnn

+0

这个问题是这样的另一个:http://stackoverflow.com/questions/8214777/alternative-to-y-but-before-a-word/ – Rodolphe

回答

0

如果你可以肯定的,那有没有像>,我会使用indexOf功能迭代,而不是使用正则表达式:

index = string.indexOf("<", lastIndex); 
index = string.indexOf(">", index); 
index = string.indexOf("abcd", index); 
string = string.substring(0, index)+"PPP"+string.substring(index+4); 
1

假设你的“标签”不能嵌套,你可以使用先行断言:

s.replace(/abcdf(?=[^<>]*(<|$))/g, "PPP") 
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)