php - 改进工作正则表达式以匹配多行

标签 php regex

我正在尝试匹配旧 DOS 转储中的用户,以便将他们迁移到新的地方。它们以 % 符号开头,以 ] 结尾。有些在一条线上,有些则跨越多条线。

https://regex101.com/r/0h5ndW/1

我的正则表达式 %([^\%]*)] 有效,但是有没有更好的方法来选择从 %] 的每个用户 (包括 %]),以便我可以将它们通过 preg_replace 并稍后操作它们?

我对多行部分有点怀疑。

预期输出

%user:100 [     type=admin,     added=10/12/1997,     last-login:10/20/1997,     total-logins:45,     status:1 ]
%user:111 [     type=user,     added=10/12/1997,     last-login:10/27/1997,     total-logins:145,     status:1 ]
%user:112 [ type=viewer, added=10/12/1997,     last-login:10/23/1997,     total-logins:6,     status:1 ]
%user:113 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:2, status:1]
%user:114 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:1, status:1]
%user:115 [ type=viewer, added=10/12/1997,  last-login:10/12/1997,  total-logins:1, status:1 ]

原始数据

%user:100 [
    type=admin,
    added=10/12/1997,
    last-login:10/20/1997,
    total-logins:45,
    status:1
]

%user:111 [
    type=user,
    added=10/12/1997,
    last-login:10/27/1997,
    total-logins:145,
    status:1
]

%user:112 [ type=viewer, added=10/12/1997,
    last-login:10/23/1997,
    total-logins:6,
    status:1
]

%user:113 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:2, status:1]

%user:114 [ type=viewer, added=10/12/1997,  last-login:10/14/1997,  total-logins:1, 
status:1]

%user:115 [ type=viewer, added=10/12/1997,  last-login:10/12/1997,  total-logins:1, 
status:1
]

最佳答案

您可以使用此正则表达式进行搜索:

((?:^%|(?!\A)\G).*)\R(?=[^][]*])

并将其替换为:

$1

Updated RegEx Demo

PHP 代码:

$repl = preg_replace('/((?:^%|(?!\A)\G).*)\R(?=[^][]*])/m', '$1', $str);

正则表达式详细信息:

  • (:启动捕获组 #1
    • (?:^%|(?!\A)\G):在行开头匹配 % 或从上一个匹配末尾重新开始匹配。 \G 断言上一个匹配的末尾位置或第一个匹配的字符串开头位置。
    • .*:匹配同一行中的所有内容
  • ):结束捕获组#1
  • \R:匹配任何类型的换行符
  • (?=[^][]*]):确保前面有 ] 且不匹配 [ ] 介于两者之间。

关于php - 改进工作正则表达式以匹配多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65264739/

相关文章:

JavaScript 正则表达式用于在两个组之间显式选择项目?

Php 跳过第一个 MySQL 行。不是常见的 double fetch() 错误

java - 如何在android中使用正则表达式为文本着色

php - PHP include() 的限制

javascript - CORS 错误仅对 400 个错误请求使用react获取请求

ruby - 解析具有嵌套信息结构的纯文本文件的最佳方法

java - 检查 Java 正则表达式中模式的第 n 次出现

java - 如何替换 Java 字符串中的一组标记?

php - 使用 $this->input->get() 时缺少 @ 符号

javascript - 访问 javascript 对象失败