2012-01-09 79 views
2

對不起,我的英語的Javascript正則表達式匹配和替換百分比符號

我試圖取代一切,是不是%d,%M或%Y從一個字符串,我一直在努力,但我不明白這一點,在這裏是我最好的嘗試代碼:

var old_string = "%l %d de %M de %Y (Semana %W)";    
string = old_string.replace(/[^(%d|%m|%Y)]/g, " ");    
alert(old_string + " <----> " + string); 

有些幫助嗎? 我在做什麼錯?

+1

一方面不名的字符串變量'string'這是一個JavaScript關鍵字... – Neal 2012-01-09 18:02:13

+1

應的例子字符串是什麼樣的替代品之後?你想在每個單詞的字符串中增加一個空格嗎?括號是否應該保留? – murgatroid99 2012-01-09 18:16:59

+2

'string'肯定不是JavaScript中的關鍵字。儘管對於變量來說這不是一個很好的選擇,但對於這個例子來說它沒有任何問題。 – pimvdb 2012-01-09 18:21:35

回答

2

如果我理解正確,你想從你的字符串中得到子字符串%d%m%Y。我假設你想在每場比賽之間有一個空間,並且想保留原來的發生順序。

你可以做到這一點使用String.match()Array.join(),像這樣:

var old_string = "%l %d de %m de %Y (Semana %W)"; 
var matches = old_string.match(/%[dmY]/g); 
var new_string = matches.join(" "); 

alert(new_string); // "%d %m %Y" 

編輯:這裏是一個工作演示:http://jsfiddle.net/PPvG/Gv3rX/1/

編輯(2):我實現了正則表達式可以進一步簡化。

+0

var old_string =「%l%d de%m de%Y(Semana%W)」; %m是小寫。感謝致敬。 – 2012-01-09 18:30:33

+1

@el_quick:我更新了答案。 – PPvG 2012-01-09 18:32:10

+0

不錯的例子,非常感謝。 – 2012-01-09 18:37:29

0

在您的代碼中,您正在錯誤地使用字符類。您的正則表達式將匹配任何不是(%d|mY)之一的單個字符。相反,您可能希望使用負向查找來檢查您匹配的字符串是否不是指定的字符串之一。下面的正則表達式應該這樣做:

/(?!(.*?)%(d|m|Y).*).*/ 

這將替換任何長度不包含指定字符串的字符串與一個空格的字符串。

0

如果我理解正確,您的結果字符串將是%d de de %Y (Semana),這對我來說沒有意義,因爲我是西班牙用戶。但是,這是您的正則表達式消歧的替代方法。

var old_string = "%l %d de %M de %Y (Semana %W)"; 
var new_string = ""; 

var i = 0; 
while (i < old_string.length) { 
    var char = old_string[i]; 

    new_string += char; 
    if (char == "%") { 
     ++i; 

     var next_char = old_string[i]; 

     switch (next_char) { 
      case "d": 
      case "m": 
      case "Y": 
       new_string += next_char; 
       break; 
      default: 
       new_string = new_string.substring(0, new_string.length - 2); 
     } 
    } 

    ++i; 
} 


alert(new_string); 
+1

這不是一個相當迂迴的做'old_string.match(/%[dmY]/g).join('')'嗎?我同意,如果可能的話,應該避免使用正則表達式,如果它們使解決方案不清楚的話。但恕我直言,在這裏幾乎不是這種情況。 – PPvG 2012-01-09 19:20:25

相關問題