You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HSQLDB的REGEXP_REPLACE语法问题:JDBC转义拦截大括号

解决HSQLDB REGEXP_REPLACE移除末尾括号内4位数字的JDBC转义问题

问题分析

你要移除字符串末尾括号中的4位数字,但原正则'([0-9]{4})$'存在两个核心问题:

  1. 未匹配括号本身——你需要的是匹配(xxxx)格式的末尾内容,原正则仅匹配了末尾4位数字,未包含括号
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:47:19