使用PCRE2(PHP>=7.3)正则删除#1字段重复行仅保留最后出现的行
结论
该需求可以通过PCRE2正则实现,核心逻辑是利用正向预查筛选出所有#1字段后续还有重复出现的行,直接删除这类行即可保留每个#1对应的最后一次出现的行。
具体实现
正则规则
匹配待删除行的正则表达式如下,需同时开启m(多行模式)、s(点号匹配换行符)修饰符:
/^(\S+)\h+.*$(?=.*^\1\h+)/ms
规则拆解:
^:匹配当前行的行首(\S+):捕获组1,匹配无空格的#1字段\h+:匹配#1和#3之间的水平空白(即#2字段).*$:匹配当前行剩余所有内容直到行尾(?=.*^\1\h+):正向肯定预查,验证后续文本中是否还存在相同#1字段开头的行,如果存在则说明当前行是重复的非最后一行,需要删除
PHP代码示例(适配PCRE2环境)
<?php // 原始文本 $rawText = <<<EOF #1 #2 #3 green [foo] [foo1] red [foo] blue [foo] [foo1] [foo2] yellow [foo2] green [foo] green [foo] [foo1] red [foo] pink [foo3] EOF; // 第一步:删除表头行 $processed = preg_replace('/^#1\h.*\R/', '', $rawText); // 第二步:删除所有#1重复的非最后行 $processed = preg_replace('/^(\S+)\h+.*$(?=.*^\1\h+)/ms', '', $processed); // 第三步:清理多余空行 $processed = trim(preg_replace('/\R{2,}/', "\n", $processed)); // 输出结果 echo $processed; ?>
运行上述代码输出结果和预期完全一致:
blue [foo] [foo1] [foo2] yellow [foo2] green [foo] [foo1] red [foo] pink [foo3]
内容的提问来源于stack exchange,提问作者user17032581
相关产品推荐
相关产品推荐

