我有一个正则表达式,可以检测引号中的文本(第一组)和绑定参数(第二组)。为避免替换其中的绑定参数,需要对引号中的文本进行分组。
('[^\\n']*')|(:\\s*\\w+)
我试着保留第一组而把第二组换成“?“:
public static String replaceBindVars(String value) {
return value.replaceAll("('[^\\n']*')|(:\\s*\\w+)", "$1?");
}
问题是,它增加了“?“在第一组之后。
代码进行测试,结果在所有情况下都应该为true:
public static void main(String[] args) {
System.out.println("WHERE id = ? and productcode = ?"
.equals(replaceBindVars("WHERE id = :id and productcode = :product_code")));
System.out.println("WHERE id = ? and productcode = '1:2 :3'"
.equals(replaceBindVars("WHERE id = :id and productcode = '1:2 :3'")));
System.out.println("WHERE id = ? and code LIKE ': some-string with :colon and :bind_parameters' OR product_name LIKE ?'".
equals(replaceBindVars("WHERE id = :id and code LIKE ': some-string with :colon and :bind_parameters' OR product_name LIKE :product_name'")));
System.out.println("SELECT ? and ? WHERE id = 2 and product_code = 3".
equals(replaceBindVars("SELECT :id and :product_code WHERE id = 2 and product_code = 3")));
}
有什么方法可以修改我当前的正则表达式,使其不添加“?“在引号中绑定参数之后?Java的最佳版本是8。
我看到this类似的问题,但它没有帮助。
1条答案
按热度按时间ki0zmccv1#
您可以使用变量替换
public String replaceAll(Function<MatchResult,String> replacer)
:请参见this Java demo。
如果组1匹配,则输出组1的值(不做任何更改),否则,将匹配替换为
?
字符(这样,组2中就不需要了)。在Java 8和更早的版本中,您可以使用