2010-02-13 64 views
1

我有一個正則表達式查詢的整個數組,以遞歸方式按順序遍歷字符串。javascript正則表達式多個查詢

有沒有一種方法,我可以做到這一切與1調用,如(不工作)?

str.replace(/query1|query2|query3|query4|...|[0-9]+|[^]/, 
      "reslt1|reslt2|reslt3|reslt4|...|procNumb|procChar"); 

它只需要在Firefox中工作。現在我堅持:

str.replace(... ,function(a,b,c){if (a=="query1") return "reslt1"; ..............}); 

謝謝!

編輯:對不起,如果混淆。目標:

前: 「query1query3x123query2」 後: 「reslt1reslt3procChar(X)procNumb(123)reslt2」

主要的是,我需要我來一次處理遞歸串1片段,所以我覺得我必須使用這樣的超級查詢來匹配任何,或根本不使用正則表達式。我只是想知道是否有一種方法可以在使用大量管道時自動將結果與查詢配對。我不是很熟悉javascript正則表達式,但我不能在mdc上找到任何東西。

+0

目前尚不清楚你想要做什麼。你可以包括「之前」和「之後」的例子(簡化的,理想的)? –

+0

你是否試圖將多個'str.replace'調用合併爲一個?我不認爲這是可能的。只是想指出你在最後一個正則表達式中沒有逃過'^',^表示字符類中的否定。它應該是'[\ ^]'。 – Amarghosh

+0

[^]匹配任何一個字符。 – user202987

回答

1

如果你想匹配任何幾種可供選擇的子串,並提供不同的結果每場比賽,你將不得不使用一個功能(你似乎在做)。例如:

var str = "ABCDE"; 

str = str.replace(/A|B|C|D/g, function(match) { 
    var rv; 
    switch (match) 
    { 
     case 'A': 
      rv = '1'; 
      break; 
     case 'B': 
      rv = '2'; 
      break; 
     case 'C': 
      rv = '3'; 
      break; 
     case 'D': 
      rv = '4'; 
      break; 
    } 
    return rv; 
}); 
alert(str); // Alerts 1234E 

(當然,這具體的例子會更好,因爲一個數組查找完成。)

如果你是一個垂直簡潔惡魔(我不是,但也有一些),您可以使用早期的回報:

str = str.replace(/A|B|C|D/g, function(match) { 
    switch (match) 
    { 
     case 'A': return '1'; 
     case 'B': return '2'; 
     case 'C': return '3'; 
     case 'D': return '4'; 
    } 
}); 
alert(str); // Alerts 1234E 

編輯只是要清楚,我的「數組查找」上述評論:如果真的更換隻是一個靜態查找,你可以這樣做:

var str, replacements, key, rex; 

// Potentially one-time prep, if you're re-using this lookup 
replacements = { 
    "A": "1", 
    "B": "2", 
    "C": "3", 
    "D": "4" 
}; 
rex = []; 
for (key in replacements) 
{ 
    rex.push(key); 
} 
rex = new RegExp(rex.join('|'), "g"); 

// The bit you reuse 
str = "ABCDE"; 
str = str.replace(rex, function(match) { 
    return replacements[match]; 
}); 
alert(str); // Alerts 1234E 

...因爲JavaScript對象是關聯數組。

+0

關於「如果你是一個垂直簡潔的惡魔」 - 你不能認真地說第一個例子比第二個例子更可讀,你能嗎? –

+0

我鄙視所有的空白,我想我會這樣做(第二種風格:P),我只是想着寫一個更簡潔的方式。格式化替換字符串...是有道理的。 – user202987

+0

@Max:我發現它*至少*可讀,不少,不多。上述這些瑣碎的例子構成了可讀性辯論的糟糕基礎。 :-)反正你不會那樣做,至少不用JavaScript;你會使用一個對象(關聯數組)查找。但對於任何更復雜的事情,我絕對會以第一種方式來做。通常的可維護性準則之一是從一個函數返回一次。這不是我一直遵循的準則,但一般來說,是的。它使調試更容易,使功能在增強時不易受損等。 –

0

爲什麼你不只是在一個循環中運行他們一個個像這樣:

for (var i = 0; i < regexes.length; i++) { 
    str = str.replace(regexes.regex, regexes.result); 
} 

這很容易理解,或多或少易於維護,而且很可能不止一個巨大的查詢速度更快。這些正則表達式的替代品價格非常昂貴。

0

假設你想reslt2更換query1reslt1query2,等等,我不認爲可以用一個單一的正則表達式來完成。然而,這是相當簡單的使用NX2陣列(或對象,但這樣的定義會更詳細):

var repl_table = [[/query1/g, 'reslt1'], 
        [/query2/g, 'reslt2'], 
        [/query3/g, 'reslt3'], 
        [/query4/g, 'reslt4'], 
        [/([0-9]+)/g, 'procNumb($1)'], 
        [/([^])/g, 'procChar($1)']] 

function repl(s, table) { 
    for (var i=0; i<table.length; i++) { 
    s = s.replace(table[i][0], table[i][1]); 
    } 
    return s; 
} 

// Then call: 
result = repl(source, repl_table);