【问题标题】:Replace leading zeros with spaces用空格替换前导零
【发布时间】:2016-12-05 02:18:47
【问题描述】:

我有一个包含多个记录的文本文件。每条记录都有一个字段,其中包含一些前导零,我需要用该数量的空格替换它们。记录将如下所示:

A206   000001204   X4609

我需要这样的记录:

A206        1204   X4609

我对正则表达式非常不熟悉,但以下正则表达式似乎找到了我需要的匹配项:

\b0+

但是,我不知道如何进行替换。 Notepad++ 的 ReplaceAll 会很棒,但如果需要,我也可以在 C#、Powershell 或 Python 中创建一个快速程序。任何人都可以给我一些关于这个正则表达式的指示吗?

【问题讨论】:

  • 什么指针?你需要什么?你似乎有正则表达式,对吧?
  • 这感觉就像XY problem。为什么首先要麻烦重新格式化文件?
  • 并非所有文本文件都可以用正则表达式解析,否则它们会变得非常混乱。 40 多年来,我一直在解析文本文件。如果没有看到文本文件的示例,我无法给出一个很好的解决方案。
  • @nicael - 我在更换时遇到问题。我似乎不知道如何用 x 个空格替换 x 个零。
  • @BobKaufman - 生成文件的系统无法以任何其他方式生成它,并且将接受文件的系统需要它,而该字段上没有前导零。所以我需要重新格式化文件。

标签: c# python regex powershell notepad++


【解决方案1】:

是的,\b0+ 可能会起作用。

这里使用Regex.Replace() method 中的C#

using System.Text.RegularExpressions;

Regex.Replace(inputString, @"\b0+", m => "".PadLeft(m.Value.Length,' '));

Replace() 的最后一个参数是一个简单的 lambda 函数,它返回一个长度与匹配的 0s 的数量相同的字符串,但只包含空格


您可以在 PowerShell 中执行相同的操作,将 scriptblock 替换为 lambda 函数:

PS C:\> $inputString = 'A206   000001204   X4609'
PS C:\> [regex]::Replace($inputString, '\b0+', {param($m) ' ' * $m.Value.Length})
A206        1204   X4609

【讨论】:

  • 空格在哪里?
  • 所以我选择了 C# 解决方案,但它只用 1 个空格替换了 x 个零。我需要用 x 个空格替换 x 个零。
  • 有趣。我从未在 PowerShell 中见过 lambda 委托。
  • @BaconBits PowerShell 没有 lambda 语法(因此,使用了脚本块)
【解决方案2】:

这就够了吗?

while (dataString.Contains(" 0")) // while data contains a zero after a space
    dataString = dataString.Replace(" 0", "  "); // Replace with two spaces

虽然这不使用正则表达式。

我希望这会有所帮助。

【讨论】:

  • 替换为" "(两个空格)以保留前导空格
  • @MasterXD 您编辑的解决方案同样有效!谢谢!
【解决方案3】:

使用 Npp:

  • Ctrl+H
  • 查找内容:\b0
  • 替换为:(空格)
  • 全部替换

【讨论】:

    【解决方案4】:

    作为Mathias' lambda 表达式解决方案的替代方案,您还可以使用更“常规”的方法,如下所示:

    $str = 'A206   000001204   X4609'
    $re  = '\b0+'
    
    if ($str -match $re) {
      $str -replace $re, (' ' * $matches[0].Length)
    }
    

    【讨论】:

      【解决方案5】:

      我的 Notepad++ 正则表达式建议没有 Toto 的那么短,但更严格一些。

      查找内容:(?: \K|\G)0

      替换为:

      这将寻找一个空格,然后忘记它(\K 的赞美 - Keep 元字符),然后单独匹配每个连续的零(\G 的赞美 - Continue 元字符)。

      全部替换将提供所需的结果。

      我发布这个是为了让这个页面更适合未来可能有不同要求的研究人员。

      【讨论】:

        猜你喜欢
        • 2020-10-17
        • 2012-09-14
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2018-10-04
        相关资源
        最近更新 更多