我想用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);
我想用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);
最直接的翻譯是:
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*))?");
命名組在.NET中的表現與在所有其他正則表達式中的表現不同。您有:
(?<Domain>pattern)
的Java(和其他人)預計:
(?P<Domain>pattern)
Java不具備@串符號。所以,確保你在你的正則表達式中跳過所有'\'。 (\w+ becomes> \\w+, \/ becomes> \\/, \x21 becomes> \\x21, etc.)
Java沒有命名組所有,但。他們正在Java 7中添加。 – 2009-08-02 05:18:08