【问题标题】:Regex for removing trailing zeros用于删除尾随零的正则表达式
【发布时间】:2009-07-09 18:18:32
【问题描述】:

我正在寻找一个正则表达式 (.NET) 来删除尾随零:

11645766.560000001000 -> 11645766.560000001 10190045.740000000000 -> 10190045.74 1455720.820000000100 -> 1455720.8200000001

等等……


我在 String.Trim() 上使用正则表达式,因为数字在一个字符串中,实际示例:
!BEGIN !>>C85.18 POS_LEVEL.T129{11645766.560000001000} = POS_LEVEL.T129 {10190045.740000000000} + WORK_LEVEL.T129{1455720.820000000100} END;

需要转换为:

!BEGIN !>>C85.18 POS_LEVEL.T129{11645766.560000001} = POS_LEVEL.T129{10190045.74} + WORK_LEVEL.T129{1455720.8200000001} END;

【问题讨论】:

  • 删除了我的回复,因为这个问题与原来的问题有很大的不同。
  • 应该在 SO 上找到针对“Barbapapa”问题的解决方案(即在原始问题发布几个小时后完全不同的问题)

标签: .net regex


【解决方案1】:

如果数字嵌入在随机字符串中,则可以使用正则表达式:

(?<=\.\d+?)0+(?=\D|$) 替换为空字符串

如果尾随零出现在十进制数字的句点之后,这将修剪它们(它总是会留下一个零)。它还考虑了出现在最后的数字。

由于您同时添加了 .NET 标记,代码如下:

string replaced = Regex.Replace(
                         inputString,
                         @"(?<=\.\d+?)0+(?=\D|$)",
                         String.Empty);

【讨论】:

  • 我在regexhero.net 使用替换功能测试了所有样本编号,您的正则表达式运行良好。
  • 哦,好吧,我猜谁不喜欢正则表达式可能是解决这个问题的最佳解决方案的想法
  • 哪里失败了?我已经测试过了,我看不出它有什么问题。你能说得更具体点吗?
  • 我的印象是您不能在后视中使用 + 或 * 字符。在 gskinner.com/regexr 上尝试您的正则表达式时,它也不起作用。一些正则表达式有不同的标准吗?仅供参考,我不是反对者。
  • 您可以在 .NET 正则表达式引擎的后视中使用 + 或 *。 gskinner.com/regexr 虽然不使用 .NET 引擎。但是 regexhero.net 可以。
【解决方案2】:

在 .Net 中,您可以执行以下操作

var newStr = Regex.Replace(input, "0+$",String.Empty);

【讨论】:

  • +1 - 原始问题与编辑后的问题是完全不同的问题。你不应该投反对票。
【解决方案3】:
([0]+)\b

然后删除$1

【讨论】:

  • +1 - 原始问题与编辑后的问题是完全不同的问题。你不应该投反对票。
  • 这是 SO 的问题之一。
  • 在我有限的经验中,'.'被认为是一个单词边界字符,使得这个实现在该点之前删除一个零。
  • 维克多说得对。而不是 \b,我会建议 (?![.\d]) -“后面不跟点或数字”。至少,直到 OP 再次更改要求。 ;)
  • 但是您不需要捕获零并显式删除它们。只需将匹配的文本替换为空字符串,就像 activa 所做的那样。
【解决方案4】:

对上述 RegEx AND Trim() 的一个警告...如果您的输入没有小数点,您可能会得到错误的数字。例如,("1000").TrimEnd('0') = 1。

此解决方法将解决该问题:

string Trimmed = (Untrimmed.IndexOf('.')>=0) ? Untrimmed.TrimEnd('0') : Untrimmed;

当然,使用一个“。”小数是特定于文化的——一些文化使用逗号。如果您尝试建立文化意识,则需要使用 System.Threading.Thread.CurrentThread.CurrentCulture.NumberDecimalSeparator 而不是文字“。”字符。

编辑:根据您上面编辑的问题,RegEx 是正确答案。比如:

Trimmed = RegEx.Replace(Untrimmed, "(\d\.\d*[1-9])0+([^\d]|$)", "$1$2");

(上面的 [1-9] 是我避免 \d 贪婪并捕获 0 的懒惰方法,可能有更直接的方法。)

【讨论】:

    【解决方案5】:

    以下将匹配小数点后面的零和任意数量的小数,以及不前面的小数点或数字。

    (?<=\.\d*)(0+)(?=[^.\d])
    

    【讨论】:

    • 因为它没有解决所提出的问题。提问者问的东西,这样做:11645766.560000001000 - > 11645766.560000001 10190045.740000000000 - > 10190045.74 1455720.820000000100 - > 1455720.8200000001根据监管者,你做到这一点:11645766.560000001000 - > 0.560000001000 10190045.740000000000 - > 0.740000000000 1455720.820000000100 - > SPAN>
    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2013-06-25
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多