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

Java中匹配未被单引号包裹字符串的正则表达式求解

解决方案:匹配未被单引号包裹、非下划线连接的违规字符串

核心思路

要实现需求,正则需要同时满足两个条件:

  • 目标字符串不在单引号对内部
  • 目标字符串前后没有下划线(排除下划线连接的情况)

修正后的代码

for (int i = 0; i < strTables.length; i++) {
    String target = strTables[i];
    // 构造正则:排除单引号内内容,且目标前后无下划线/单引号
    String pattern = "(?=(?:[^']|'[^']*')*$)(?<!['_])" + Pattern.quote(target) + "(?!['_])";
    Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
    Matcher m = r.matcher(line);
    if (m.find()) {
        System.out.println(target + ": " + line);
        break;
    }
}

正则各部分解释

  1. (?=(?:[^']|'[^']*')*$):正向预查,确保当前位置到行尾的单引号是成对闭合的,直接排除单引号内部的所有内容。
  2. (?<!['_]):负向回顾后发断言,保证目标字符串前没有单引号或下划线。
  3. Pattern.quote(target):转义目标字符串中的正则特殊字符(如.、*),避免语法冲突,这是之前代码缺失的关键细节。
  4. (?!['_]):负向先行断言,保证目标字符串后没有单引号或下划线。

测试案例验证

测试行结果原因
SELECT * FROM FOO;匹配(违规)FOO不在单引号内,前后无下划线
SELECT * FROM 'FOO';不匹配FOO在单引号内部
SELECT * FROM MY_FOO;不匹配FOO前有下划线
FOO_BAR is invalid?不匹配FOO后有下划线
FOO123 is bad匹配(违规)FOO不在单引号内,前后无下划线

内容的提问来源于stack exchange,提问作者nightfox79

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:09:22