PCRE正则匹配问题:仅当DB_DATABASE前三行存在mysql时匹配对应内容
可行PCRE正则方案
针对你需要的「仅DB_DATABASE往前3行存在'mysql'时才匹配」的需求,适用的PCRE正则如下:
匹配整行(包含DB_DATABASE的完整行)
(?m)^.*'mysql'.*\R(?:^.*\R){3}.*DB_DATABASE.*$
仅匹配DB_DATABASE字符串(适合编辑器直接选中操作)
(?<=(?m:^.*'mysql'.*\R(?:^.*\R){3}.*))DB_DATABASE
规则说明
(?m):开启PCRE多行模式,让^和$可以匹配每一行的首尾,而非整个文本的首尾^.*'mysql'.*\R:匹配任意包含'mysql'字符串的行,以及该行末尾的任意类型换行符(\R兼容Windows\r\n、Linux\n、macOS\r)(?:^.*\R){3}:非捕获组,重复3次代表连续匹配3个完整的行,如果你需要调整往前数的行数n,直接把3改成对应数值即可- 该逻辑严格限定mysql所在行和DB_DATABASE所在行之间恰好间隔3行,超出或不足都不会命中,完美排除其他数据库引擎的配置干扰
原正则问题排查
你之前的写法存在两个核心问题:
- 开头的
[\S\s]*?虽然是惰性匹配,但依然可以跨越任意行数查找mysql,没有锚定行边界,容易出现跨行误匹配 mysql\S*$限定了mysql后面必须跟非空白字符到行尾,无法匹配mysql后带空格、逗号等其他字符的正常配置行
内容的提问来源于stack exchange,提问作者Vicky Dev
相关产品推荐
相关产品推荐

