regex 正则表达式替换不在引号中的绑定参数

kulphzqa  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(128)

我有一个正则表达式,可以检测引号中的文本(第一组)和绑定参数(第二组)。为避免替换其中的绑定参数,需要对引号中的文本进行分组。

('[^\\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类似的问题,但它没有帮助。

ki0zmccv

ki0zmccv1#

您可以使用变量替换 public String replaceAll​(Function<MatchResult,String> replacer)

public static final Pattern regex = Pattern.compile("('[^\\n']*')|:\\s*\\w+");
public static String replaceBindVars(String value) {
    return regex.matcher(value).replaceAll(m -> m.group(1) != null ? m.group(1) : "?"); 
}

请参见this Java demo
如果组1匹配,则输出组1的值(不做任何更改),否则,将匹配替换为?字符(这样,组2中就不需要了)。
在Java 8和更早的版本中,您可以使用

public static final Pattern regex = Pattern.compile("('[^\\n']*')|:\\s*\\w+");
public static String replaceBindVars(String value) {
    StringBuffer result = new StringBuffer();
    Matcher m = regex.matcher(value);
    while (m.find()) {
        if (m.group(1) != null) {
            m.appendReplacement(result, Matcher.quoteReplacement(m.group(1)));
        } else {
            m.appendReplacement(result, "?");
        }
    }
    m.appendTail(result);
    return result.toString(); 
}

相关问题