JSQLParser (V0.8.9) を使用すると、これが問題の解決策になります。
String sql ="SELECT NAME, ADDRESS, COL1 FROM USER WHERE SSN IN ('11111111111111', '22222222222222');";
Select select = (Select) CCJSqlParserUtil.parse(sql);
//Start of value modification
StringBuilder buffer = new StringBuilder();
ExpressionDeParser expressionDeParser = new ExpressionDeParser() {
@Override
public void visit(StringValue stringValue) {
this.getBuffer().append("XXXX");
}
};
SelectDeParser deparser = new SelectDeParser(expressionDeParser,buffer );
expressionDeParser.setSelectVisitor(deparser);
expressionDeParser.setBuffer(buffer);
select.getSelectBody().accept(deparser);
//End of value modification
System.out.println(buffer.toString());
//Result is: SELECT NAME, ADDRESS, COL1 FROM USER WHERE SSN IN (XXXX, XXXX)
これにより、SQL 内で見つかったすべての文字列値が置き換えられます。他のタイプのデータ (Long 値など) を置き換えるには、対応する visit メソッドを でオーバーライドしますExpressionDeParser
。
この場合、正規表現を使用しないでください。メンテナンスが難しいことがすぐにわかります。