2009-08-02 48 views
1

我想用Java代碼中的C#.NET代碼編寫下面的正則表達式,但我似乎無法正確轉換它,你能幫我嗎?如何將正則表達式轉換爲有效的Java格式?

Regex(@"\w+:\/\/(?<Domain>[\x21-\x22\x24-\x2E\x30-\x3A\x40-\x5A\x5F\x61-\x7A]+)(?<Relative>/?\S*)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline); 

回答

1

最直接的翻譯是:

Pattern p = Pattern.compile(
    "\\w+://([\\x21-\\x22\\x24-\\x2E\\x30-\\x3A\\x40-\\x5A\\x5F\\x61-\\x7A]+)(/?\\S*)", 
    Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 

Java有沒有類似C#的逐字字符串,所以你總是有逃避反斜槓。 Java的正則表達式不支持命名組,因此我將它們轉換爲簡單捕獲組(命名組將在Java 7中添加)。

但也有一些問題與原來的正則表達式:

  • RegexOptions.Compiled修飾符沒有做什麼,你可能認爲它。具體而言,它與Java的compile()方法無關;這只是一種工廠方法,大致相當於C#的構造函數new Regex()Compiled修飾符導致正則表達式被編譯爲到CIL字節碼,這可以使其匹配更快,但是在前期處理和內存使用中花費相當大的成本 - 並且該內存永遠不會被垃圾收集。如果你不使用正則表達式很多,Compiled選項可能會造成更多的傷害,而不是好的,性能明智的。

  • IgnoreCase/CASE_INSENSITIVE修飾符是毫無意義的,因爲您的正則表達式在匹配字母時總是匹配大寫和小寫變體。

  • Singleline/DOTALL修飾符是毫無意義的,因爲您從不使用點元字符。

  • 在.NET正則表達式中,字符級速記\w支持Unicode,相當於[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。在Java中,它只有ASCII - [A-Za-z0-9_] - 這看起來更符合你使用它的方式(你可以使用RegexOptions.ECMAScript修飾符在.NET中「愚弄它」)。

所以實際的翻譯會比較喜歡這樣的:

Pattern p = Pattern.compile("\\w+://([\\w!\"$.:@]+)(?:/(\\S*))?"); 
1

命名組在.NET中的表現與在所有其他正則表達式中的表現不同。您有:

(?<Domain>pattern) 

的Java(和其他人)預計:

(?P<Domain>pattern) 
+0

Java沒有命名組所有,但。他們正在Java 7中添加。 – 2009-08-02 05:18:08

2

Java不具備@串符號。所以,確保你在你的正則表達式中跳過所有'\'。 (\w+ becomes> \\w+, \/ becomes> \\/, \x21 becomes> \\x21, etc.)

相關問題