如何编写正则仅匹配成对单/双引号内的@格式SQL变量
解决方案
修正后的正则表达式
你原来的正则仅能匹配成对引号,只需在引号内容规则中加入@变量的匹配逻辑即可,支持跨行场景的正则如下:
(["'])[^"']*?@\w+.*?\1
- 规则说明:匹配成对的单/双引号,且引号内部至少存在1个
@开头后跟字母/数字/下划线的变量(即你提到的@varname格式) - 如果需要兼容SQL中常见的转义引号场景(比如
''代表单引号本身),可以调整为如下规则:
(["'])(?:[^"'\\]|\\.|'')*?@\w+(?:[^"'\\]|\\.|'')*?\1
不同系统下批量获取符合条件文件名的方法
Linux / macOS 环境(使用grep)
执行以下命令即可递归扫描指定目录下所有.sql文件,直接输出符合条件的文件路径:
grep -rzoPl '(["'\''])[^"'\'']*?@\w+.*?\1' --include="*.sql" /path/to/your/sql/dir
参数说明:
-r:递归扫描目标目录-z:将文件内容按NULL符分隔,支持跨行匹配-P:启用Perl兼容正则语法-l:仅输出匹配成功的文件名,不输出具体匹配内容
Windows 环境(使用PowerShell)
执行以下PowerShell脚本即可:
# 替换为你的SQL文件根目录 $rootPath = "C:\path\to\your\sql\dir" Get-ChildItem -Path $rootPath -Recurse -Filter "*.sql" | ForEach-Object { $content = Get-Content $_.FullName -Raw if ($content -match '(["''])[^"'']*?@\w+.*?\1') { # 输出符合条件的文件完整路径 $_.FullName } }
自定义调整说明
如果你的@varname变量名支持除字母、数字、下划线之外的特殊字符,把正则中的\w+替换为对应的字符范围即可,比如支持$符号的话改为[a-zA-Z0-9_$]+。
内容的提问来源于stack exchange,提问作者Andy E
相关产品推荐
相关产品推荐

