仅当 n 行之前的另一个字符串在任何支持 PCRE 的文本编辑器中匹配时,才匹配 n 行之后的字符串

Regular Expression Match string after n lines only if another string before n lines matches in any Text Editor supporting PCRE

我有一个 PHP 数据库配置文件(在支持 PCRE 的代码编辑器中打开),其中包含用于生成连接字符串的各种引擎凭据。

现在正如我在问题标题中提到的,我想匹配特定的字符串“DB_DATABASE”,只有在 n 行之前(比如说 3)存在 'mysql',如下所示:

....
....
'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'anydb'),
....
....

如果我说在 3 行之前,那么它不应该匹配 4 行之前的“mysql”,即它不应该匹配 'mysql' => [。请注意,除了此处提到的之外,还有其他数据库引擎连接详细信息,因此需要匹配 mysql 并且仅当它恰好出现在 DB_DATABASE.

上方 3 行时

我尝试了一些复杂的正则表达式,但 none 给了我想要的,让我提一下我认为至少接近但徒劳的:

^[\S\s]*?mysql\S*$(?:\n.*){3}\S*DB_DATABASE

感谢任何努力帮助解决此问题的人...

我建议将单词作为整个单词进行匹配,并使用 \K 运算符仅使用 DB_DATABASE 字符串:

\bmysql\b.*(?:\n.*){3}\n.*\K\bDB_DATABASE\b

regex demo详情:

  • \bmysql\b - 一个完整的单词 mysql
  • .* - 该行的其余部分
  • (?:\n.*){3} - 三行
  • \n - 一个换行符
  • .* - 除换行字符外的任何零个或多个字符,尽可能多
  • \K - 匹配重置运算符,从匹配内存缓冲区中删除到目前为止匹配的文本
  • \bDB_DATABASE\b - 一个完整的单词 DB_DATABASE.

注意:如果您的行结尾是混合的或未知的,您应该将模式中出现的所有 \n 替换为 \R\R 匹配任何行结束序列)。