@ Oscar: нет, единственные литералы, которые могут вызвать у вас проблемы, это обратные слеши. По иронии судьбы ошибка, которую я сделал, идентична той, которую вы пытаетесь решить.

ли способ избежать (или защитить) специальные символы в регулярном выражении?

Я хотел бы создать простой тестер регулярных выражений:

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, Через некоторое время это становится очень раздражающим.

Q. Как я могу автоматически избежать этих специальных символов?

Ответы на вопрос(1)

Решение Вопроса

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

System.out.printf("%s ~= %s ? %s  %n", 
    args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ...
 OscarRyz11 янв. 2011 г., 04:31
Я был парой \ далек .. Я пробовал несколько комбинаций :) А как насчет специального символа, например + {(и т. Д.?
 Mark Elliot11 янв. 2011 г., 04:32
@ Oscar: нет, единственные литералы, которые могут вызвать у вас проблемы, это обратные слеши. По иронии судьбы ошибка, которую я сделал, идентична той, которую вы пытаетесь решить.
 OscarRyz11 янв. 2011 г., 04:29
Я получил:Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 pastebin.com/aEWSibXv
 Hiro2k11 янв. 2011 г., 04:29
В такие моменты хотелось бы, чтобы у Java был лучший синтаксис для буквенных строк.
 Mark Elliot11 янв. 2011 г., 04:29
@ Оскар: ой, вы должны сбежать один раз для строкового литерала, а в другой раз, потому чтоreplaceAll само по себе является регулярным выражением. Исправлено сейчас.

Ваш ответ на вопрос