2011-01-11 2 views
14

Есть ли способ избежать (или защитить) специальных символов в регулярном выражении?regex: Как избежать обратных косых черт и специальных символов?

То, что я хотел бы сделать, это создать простые регулярки тестер:

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

Вам просто нужно заменить все одиночные обратные косые черты двойной обратной косой чертой. Это немного сложно, так как функция replaceAll на String действительно выполняет регулярное выражение, и вам нужно сначала скрыть обратную косую черту, потому что это буквальный (дающий \\), а затем сбежать из него из-за регулярного выражения (давая \\\\). Замещение страдает та же участь, и требует двух таких управляющих последовательностей делает его в общей сложности 8:

обратными слэшами
System.out.printf("%s ~= %s ? %s %n", 
    args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ... 
+0

я получаю: 'Исключение в нити«основной»java.util.regex.PatternSyntaxException: непредвиденная внутренняя ошибка вблизи индекса 1 'http://pastebin.com/aEWSibXv – OscarRyz

+0

Моменты вроде этого, что я хочу, чтобы Java имел лучший синтаксис для строковых строк. – Hiro2k

+0

@ Оскар: вам нужно уйти один раз для строкового литерала и в другое время, потому что 'replaceAll' является обычным выражением. Исправлено. –

Смежные вопросы