正则表达式和转义

时间:2010-03-15 04:31:33

标签: java regex

很抱歉,如果有人问这个问题,我的搜索提出了许多非主题帖子。

我正在尝试将通配符从用户定义的搜索字符串(通配符为“*”)转换为PostgreSQL,如通配符“%”。

我想处理转义,以便"%" => "\%""\*" => "*"

我知道在替换\*之前我可以用其他内容替换*,然后将其交换回来,但我不愿意,而是仅使用以下模式转换*不在\前进时选择它。

String convertWildcard(String like)
{
    like = like.replaceAll("%", "\\%");
    like = like.replaceAll("\\*", "%");
    return like;
}

Assert.assertEquals("%", convertWildcard("*"));
Assert.assertEquals("\\%", convertWildcard("%"));
Assert.assertEquals("*", convertWildcard("\\*")); // FAIL

Assert.assertEquals("a%b", convertWildcard("a*b"));
Assert.assertEquals("a\\%b", convertWildcard("a%b"));
Assert.assertEquals("a*b", convertWildcard("a\\*b")); // FAIL

欢迎提示。

修改

澄清,

我想要一个方法,使一个或多个String.replaceAll调用转换字符串,以便

  • %的出现变为\%
  • *的出现变为%
  • \*的出现变为*

最佳答案将使用最少的String.replaceAll来电。

2 个答案:

答案 0 :(得分:1)

你需要所谓的“负面观察”。要选择%之前没有的所有\

(?<!\\)%(纯正则表达式)

要在Java中使用它,你需要添加一些掩码:

string.replaceAll("(?<!\\\\)%", "*");

答案 1 :(得分:1)

另请注意,在某些断言测试中,您没有充分转义反斜杠。请参阅http://www.regular-expressions.info/java.html

中标记为“正则表达式,文字字符串和反斜杠”的部分