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; } }
正则各部分解释
(?=(?:[^']|'[^']*')*$):正向预查,确保当前位置到行尾的单引号是成对闭合的,直接排除单引号内部的所有内容。(?<!['_]):负向回顾后发断言,保证目标字符串前没有单引号或下划线。Pattern.quote(target):转义目标字符串中的正则特殊字符(如.、*),避免语法冲突,这是之前代码缺失的关键细节。(?!['_]):负向先行断言,保证目标字符串后没有单引号或下划线。
测试案例验证
| 测试行 | 结果 | 原因 |
|---|---|---|
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
相关产品推荐
相关产品推荐

