我正在尝试匹配旧 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
PHP 代码:
$repl = preg_replace('/((?:^%|(?!\A)\G).*)\R(?=[^][]*])/m', '$1', $str);
正则表达式详细信息:
(
:启动捕获组 #1(?:^%|(?!\A)\G)
:在行开头匹配%
或从上一个匹配末尾重新开始匹配。\G
断言上一个匹配的末尾位置或第一个匹配的字符串开头位置。.*
:匹配同一行中的所有内容
)
:结束捕获组#1\R
:匹配任何类型的换行符(?=[^][]*])
:确保前面有]
且不匹配[
或]
介于两者之间。
关于php - 改进工作正则表达式以匹配多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65264739/