2011-01-11 91 views
14

有沒有辦法在正則表達式中轉義(或保護)特殊字符?正則表達式:如何避免反斜槓和特殊字符?

我想什麼做的是創建一個簡單的正則表達式測試儀:

import java.util.regex.*; 
class TestRegex { 
    public static void main(String ... args) { 
     System.out.printf("%s ~= %s ? %s %n" , args[0], args[1], Pattern.matches(args[0], args[1])); 
    } 
} 

偉大的工程之前測試我的模式插件他們進入程序:

$java TestRegex "\d" 1 
\d ~= 1 ? true 
$java TestRegex "\d" 12 
\d ~= 12 ? false 
$java TestRegex "\d+" 12 
\d+ ~= 12 ? true 
$java TestRegex "\d+" a12 
\d+ ~= a12 ? false 
$java TestRegex "\d+" "" 
\d+ ~= ? false 

下我做的事情是在我的程序中使用這種模式,但每次我必須手動將其轉移:

Pattern p = Pattern.compile(/*copy pasted regex here */); 

在此示例中,替換爲:\d\\d。過了一會兒,這變得非常刺激。

問:如何自動轉義這些特殊字符?

回答

25

你只需要用雙反斜槓替換所有單反斜槓。這很複雜一點,因爲String上的replaceAll函數確實執行了一個正則表達式,並且必須首先轉義反斜槓,因爲它是一個文字(產生\\),然後由於正則表達式(產生\\\\)而再次轉義它。更換遭受了同樣的命運,需要兩個這樣的轉義序列使其共8個反斜線:

System.out.printf("%s ~= %s ? %s %n", 
    args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ... 
+0

我得到:`異常線程「main」 java.util.regex.PatternSyntaxException:意外內部錯誤接近指數1 `http://pastebin.com/aEWSibXv – OscarRyz 2011-01-11 03:29:19