我正在编写一个 JDBC 库,它接受来自用户输入的 java.lang.String 对象并发出 JDBC SELECT 语句。我希望存在未转义的 % 字符来引导库在比较中使用 LIKE 子句,而对于没有未转义的 % 字符的字符串应使用更严格的=比较。
例如具有以下表格和数据:
CREATE TABLE S (V CHARACTER VARYING);
INSERT INTO S (V) VALUES ('%B%'); -- row a
INSERT INTO S (V) VALUES ('%%%'); -- row b
INSERT INTO S (V) VALUES ('%%X'); -- row c
我希望字符串 "\%\%\%"* (不包含未转义的 % 字符)导致以下查询:
SELECT * FROM S WHERE V = '%%%'
...仅匹配 1 行(b 行)。而字符串 "\%%\%" (包含一个未转义的 %)应该导致查询:
SELECT * FROM S WHERE V LIKE '\%%\%'
...仅匹配行 a 和 b(但不匹配 c)。
Java 中是否有一个实用程序类可以对未转义的 % 字符进行此类测试,并生成 = 比较所需的未转义版本(当所有 % 字符最初被转义?)
逻辑应该如下:
if ( unescapedPercentageExists( s ) )
likeClause( s )
else
equalClause ( removeEscapes( s ) )
最佳答案
尝试正则表达式
public static boolean unescapedPercentageExists(String s){
return s.matches(".*((?<=[^\\\\])|^)%.*");
}
测试:
abc: false
abc\%: false
\%abc: false
a\%bc: false
abc%: true
%abc: true
a%bc: true
关于java - 检查 JDBC String/VARCHAR 比较中的转义 %?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782445/