regex: как избежать обратной косой черты и специальных символов? - PullRequest
14 голосов
/ 11 января 2011

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

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

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 Ответ

26 голосов
/ 11 января 2011

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

System.out.printf("%s ~= %s ? %s  %n", 
    args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...