如何撤消正则表达式执行的替换?

时间:2011-08-31 17:32:44

标签: java regex

在java中,我有以下正则表达式([\\(\\)\\/\\=\\:\\|,\\,\\\\]),它被编译后用于使用反斜杠转义每个特殊字符()/=:|,\,如下所示escaper.matcher(value).replaceAll("\\\\$1")

因此字符串"A/C:D/C"最终会以"A\/C\:D\/C"

结尾

稍后在此过程中,我需要撤消替换。这意味着我需要匹配\(\)\/等的组合,并将其替换为紧跟在反斜杠字符后面的字符。不应匹配任何其他字符后面的反斜杠,并且可能存在没有前面反斜杠的特殊字符,在这种情况下它也不应匹配。

因为我知道所有的情况,我可以做类似

的事情
myString.replaceAll("\\(", "(").replaceAll("\\)", ")").replaceAll("\\/", "/")...

但我想知道是否有一个更简单的正则表达式允许我在一个步骤中执行所有特殊字符的替换。

2 个答案:

答案 0 :(得分:2)

我不知道java正则表达式的味道,但这与PCRE一起工作

\\后跟([()/=:|,\\])替换为$ 1

在perl中你可以做到

$str =~ s#\\([()/=:|,\\])#$1#g;

答案 1 :(得分:2)

这看起来非常简单。如果这是您的原始代码(删除了多余的转义):

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

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

......相反的是:

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

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

如果你没有逃避并且自己反转(正如你所做的那样),你会遇到问题,但这应该可以正常工作。