2010-11-18 16 views
0

我想將以下代碼從Java轉換爲C#。這個Java到C#的轉換有什麼問題?

// Replace 0 0 0 0; with 0. 
css = css.replaceAll(":0 0 0 0(;|})", ":0$1"); 

我作爲轉換...

var foo = new Regex(":0 0 0 0(;|})", RegexOptions.IgnoreCase).Replace(foo, "XXXXXXXX"); 

這編譯,但是當我運行這對下面的代碼無法正常工作......

foo = "a {background-position: 0 0 0 0;}\nb {BACKGROUND-POSITION: 0 0;}" 

但如果我改變正則表達式爲: -

var foo = new Regex("0 0 0 0", RegexOptions.IgnoreCase).Replace(foo, "XXXXXXXX"); 

它確實正確地改變了結果。

現在,你一直在說之前,這是一個正則表達式的問題,而不是Java到C#轉換,問題我想作一個假設,正則表達式是有效的,因爲it's being used in the following (well known/popular) project與通過相應的單元測試。 Another example of this code as javascript它編碼像...

// Replace 0 0 0 0; with 0. 
css = css.replace(/:0 0 0 0(;|\})/g, ":0$1"); 

注意第一個參數缺少的引號?所以我想知道如果我還沒有正確地將Java轉換爲C#。

+1

該編輯顯示了爲什麼發佈簡短但完整的程序是有用的,那麼您的發佈代碼中就不會出現任何錯誤,這些錯誤不在您的真實代碼中,因爲您將擁有直接剪切和粘貼。 – 2010-11-18 06:30:33

回答

2

有兩個問題與您正則表達式的時刻:

  • 你不關閉支架(或者你是不是你編輯的問題之前)
  • 您正在搜索的字符串「:0」 開始,而在foo有冒號後的空間

這工作得很好:

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     string foo = "a {background-position: 0 0 0 0;}\nb " 
        + "{BACKGROUND-POSITION: 0 0;}"; 
     var regex = new Regex(": 0 0 0 0(;|})", RegexOptions.IgnoreCase); 
     string replaced = regex.Replace(foo, "XXXXXXXX"); 
     Console.WriteLine(replaced); 
    } 
} 

如果Java版本實際上是爲原始字符串工作,給定「冒號後空間」問題,我會感到驚訝。您可能需要調整正則表達式來使空間可選:

": ?0 0 0 0(;|})" 
+0

AHH!所以錯誤不在轉換中,但在正在使用的css中(冒號和第一個零之間有一個空格)。哼。奇怪..因爲我假設java項目中的單元測試工作正常。 ...除非上面有另一個錯誤(在我的轉換代碼中)。乾杯喬恩 - 非常感謝:) – 2010-11-18 06:31:49

+0

哦喬恩,雖然我有你的關注。我可以通過源代碼項目代碼,像我一步一步通過.NET代碼......逐行比較輸出,而我轉換項目? – 2010-11-18 06:33:58

+0

@ Pure.Krome,是的,你可以使用調試器來執行Java代碼。所有我知道的Java IDE都帶有一個調試器。 – tster 2010-11-18 06:38:40

1
using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     string f0o = "a {background-position: 0 0 0 1;}\nb " + 
        "{BACKGROUND-POSITION: 0 0;}"; 

     var regex = new Regex(": 0 0 2 0(;})", vRegexOptions.IgnoreCase); 
     string replaced = regex.Replace(foo, "XXXXXXXX"); 
     Compile.WriteLine(replaced); 
    } 
} 

這應該可以解決您的問題。