HSQLDB的REGEXP_REPLACE语法问题:JDBC转义拦截大括号
解决HSQLDB REGEXP_REPLACE移除末尾括号内4位数字的JDBC转义问题
问题分析
你要移除字符串末尾括号中的4位数字,但原正则'([0-9]{4})$'存在两个核心问题:
- 未匹配括号本身——你需要的是匹配
(xxxx)格式的末尾内容,原正则仅匹配了末尾4位数字,未包含括号 - JDBC会把SQL语句中的
{}识别为存储过程调用的转义序列,导致{4}被错误解析,正则失效
解决方案
方案1:在SQL中双重转义大括号和括号
直接在SQL语句中,对JDBC的大括号转义(用{{代替{,}}代替}),同时对正则需要匹配的括号进行转义(SQL中反斜杠需写两次\\):
REGEXP_REPLACE(Title, '\\(\\d{{4}}\\)$', '')
\\(和\\):在HSQLDB中最终解析为\(和\),匹配实际的括号\\d{{4}}:JDBC将{{转译为{,HSQLDB收到的是\d{4},匹配4位数字$:限定匹配字符串末尾的内容- 替换为空字符串,即可移除目标内容
方案2:用PreparedStatement传递正则参数
如果是在Java代码中执行,把正则表达式作为参数传递,避免JDBC解析SQL中的大括号:
String regexPattern = "\\(\\d{4}\\)$"; PreparedStatement stmt = connection.prepareStatement( "UPDATE your_table SET Title = REGEXP_REPLACE(Title, ?, '') WHERE id = ?" ); stmt.setString(1, regexPattern); stmt.setInt(2, targetId); stmt.executeUpdate();
这种方式下,正则表达式直接传给HSQLDB,无需处理JDBC的大括号转义。
方案3:直接在HSQLDB脚本中执行(非JDBC)
如果是在HSQLDB的客户端或脚本中直接执行SQL,不需要处理JDBC的转义,只需转义正则中的括号:
REGEXP_REPLACE(Title, '\\(\\d{4}\\)$', '')
验证示例
- 输入:
"The Matrix (1999)"→ 输出:"The Matrix" - 输入:
"Inception (2010) Director's Cut"→ 输出:"Inception (2010) Director's Cut"(括号不在末尾,不匹配)
内容的提问来源于stack exchange,提问作者John Kraynack
相关产品推荐
相关产品推荐

