2011-11-23 160 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)