1

我有一个 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' => [。请注意,除了此处提到的之外,还有其他 DB 引擎连接详细信息,因此需要匹配 mysql 并且仅当它恰好出现在上面 3 行时DB_DATABASE

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

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

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

4

1 回答 1

1

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

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

请参阅正则表达式演示详情

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

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

于 2021-08-23T16:03:23.747 回答