You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:24:03