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

合并首段重复多行数据方案求助?Notepad++/PowerShell正则尝试失败

解决相同前缀行的合并需求(Notepad++正则 + PowerShell方案)

我来帮你搞定这个合并相同前缀行的需求!不管是Notepad++的正则替换,还是PowerShell脚本,都能完美实现你要的选项A(带空格分隔)和选项B(无空格分隔)效果,咱们一步步来。

一、Notepad++ 正则解决方案

首先要确保Notepad++的正则设置正确:打开「替换」窗口(快捷键Ctrl+H),选择「正则表达式」模式,并且勾选**. matches newline**(这个非常重要,否则无法跨多行匹配)。

选项B:无空格拼接内容

  1. 使用以下正则进行替换,重复点击「替换所有」直到没有匹配项:

    • 查找内容:^([^;]+;)(.*)\R\1(.+)
    • 替换为:\1\2;\3

    每次替换会把两行相同前缀的内容合并成一行,重复操作后,所有同前缀的行就会被合并成一行,内容用分号直接连接。

选项A:带空格拼接内容

和上面的步骤一样,只是替换内容改成带空格的格式:

  • 查找内容:^([^;]+;)(.*)\R\1(.+)
  • 替换为:\1\2 ;\3

正则含义解释

  • ^([^;]+;):捕获每行开头的前缀部分(从行首到第一个分号)
  • (.*):捕获第一行分号后的内容
  • \R:匹配换行符(兼容Windows/Linux的换行格式)
  • \1:匹配和捕获组1完全相同的前缀,确保是同组行
  • (.+):捕获第二行分号后的内容

二、PowerShell 脚本解决方案

如果需要批量处理或者更灵活的操作,PowerShell的分组拼接方法更可靠,不会像正则那样需要多次替换。

选项B:无空格拼接

将以下脚本保存为.ps1文件,或者直接在PowerShell控制台运行(替换input.txt和output_optionB.txt为你的实际文件路径):

# 读取输入文件
Get-Content "input.txt" | ForEach-Object {
    # 按分号分割为前缀和内容(只分割一次)
    $parts = $_ -split ';', 2
    # 生成自定义对象存储前缀和内容
    [PSCustomObject]@{
        Prefix = $parts[0]
        Content = $parts[1]
    }
} | Group-Object -Property Prefix | ForEach-Object {
    # 将同组的内容用分号拼接
    $mergedContent = $_.Group.Content -join ';'
    # 拼接前缀和合并后的内容
    "$($_.Name);$mergedContent"
} | Set-Content "output_optionB.txt"

选项A:带空格拼接

只需要把脚本中的-join ';'改成-join ' ;'即可:

Get-Content "input.txt" | ForEach-Object {
    $parts = $_ -split ';', 2
    [PSCustomObject]@{
        Prefix = $parts[0]
        Content = $parts[1]
    }
} | Group-Object -Property Prefix | ForEach-Object {
    $mergedContent = $_.Group.Content -join ' ;'
    "$($_.Name);$mergedContent"
} | Set-Content "output_optionA.txt"

为什么你之前的正则没生效?

你尝试的正则^([^;]+;).+\R(.*?\1.+(?:\R|$))+替换为\2,问题在于捕获组的范围错误:这个正则只捕获了最后一个匹配行的内容,而没有把所有同前缀行的内容都拼接起来,所以最终只保留了每组的最后一行内容,而不是所有内容的合并。

内容的提问来源于stack exchange,提问作者Batscha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:12:34