仅当 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
匹配任何行结束序列)。
我有一个 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
.
我尝试了一些复杂的正则表达式,但 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
匹配任何行结束序列)。