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
. Через некоторое время это становится очень раздражающим.
Q. Как я могу автоматически избежать этих специальных символов?
Ответы
Ответ 1
Вам просто нужно заменить все одиночные обратные косые черты двойной обратной косой чертой. Это немного сложно, так как функция replaceAll
на String
действительно выполняет регулярное выражение, и вам нужно сначала скрыть обратную косую черту, потому что это буквальный (уступающий \\
), а затем сбежать из него из-за регулярного выражения ( давая \\\\
). Замена страдает аналогичной судьбой и требует двух таких escape-последовательностей, что составляет в общей сложности 8 обратных косых черт:
System.out.printf("%s ~= %s ? %s %n",
args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ...