很抱歉,如果有人问这个问题,我的搜索提出了许多非主题帖子。
我正在尝试将通配符从用户定义的搜索字符串(通配符为“*”)转换为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
来电。
答案 0 :(得分:1)
你需要所谓的“负面观察”。要选择%
之前没有的所有\
:
(?<!\\)%
(纯正则表达式)
要在Java中使用它,你需要添加一些掩码:
string.replaceAll("(?<!\\\\)%", "*");
答案 1 :(得分:1)
另请注意,在某些断言测试中,您没有充分转义反斜杠。请参阅http://www.regular-expressions.info/java.html
中标记为“正则表达式,文字字符串和反斜杠”的部分