java - 检查 JDBC String/VARCHAR 比较中的转义 %?

标签 java sql regex jdbc

我正在编写一个 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/

相关文章:

mySQL 重复事件查询

sql - 基于多对多过滤器进行选择

ruby-on-rails - 用于验证仅包含字符(非特殊字符)、空格和数字的字符串的正则表达式

java - 如何添加到具有外键的数据库

java - Java 中的 C# InvalidEnumArgumentException

java - 如何在 Hibernate 中使用 Oracle 函数获取 ID

java - JButton 覆盖其他按钮

php - 如何按大多数 View 类别明智地对数据进行排序

Java-正则表达式 : Several matches in same string

python - 优化长表达式列表的正则表达式匹配