Как отменить замену в regex? - PullRequest
1 голос
/ 31 августа 2011

В Java у меня есть следующее регулярное выражение ([\\(\\)\\/\\=\\:\\|,\\,\\\\]), которое компилируется, а затем используется для экранирования каждого из специальных символов ()/=:|,\ с обратной косой чертой следующим образом escaper.matcher(value).replaceAll("\\\\$1")

Таким образом, строка "A/C:D/C" будет иметь вид "A\/C\:D\/C"

Позже в процессе мне нужно отменить эту замену. Это означает, что мне нужно сопоставить комбинацию \(, \), \/ и т. Д. И заменить ее на символ, следующий сразу за символом обратной косой черты. Обратная косая черта, за которой следует любой другой символ, не должна совпадать, и могут быть случаи, когда специальный символ будет существовать без предшествующей обратной косой черты, и в этом случае он также не должен совпадать.

Поскольку я знаю все случаи, я мог бы сделать что-то вроде

myString.replaceAll("\\(", "(").replaceAll("\\)", ")").replaceAll("\\/", "/")...

но мне интересно, есть ли более простое регулярное выражение, которое позволило бы мне выполнить замену всех специальных символов за один шаг.

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Это кажется довольно простым. Если бы это был ваш исходный код (лишние побеги удалены):

Pattern escaper = Pattern.compile("([()/=:|,\\\\])");

String escaped = escaper.matcher(original).replaceAll("\\\\$1");

... будет наоборот:

Pattern unescaper = Pattern.compile("\\\\([()/=:|,\\\\])");

String unescaped = unescaper.matcher(escaped).replaceAll("$1");

Если бы вы не убегали и не убегали от обратной косой черты (как вы делаете), у вас были бы проблемы, но это должно работать нормально.

2 голосов
/ 31 августа 2011

Я не знаю аромата java regex, но эту работу с PCRE

заменим \\ с последующим ([()/=:|,\\]) на $ 1

в perl, который вы можете сделать

$str =~ s#\\([()/=:|,\\])#$1#g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...