【问题标题】:How to find numbers and exclude any in parentheses using regex如何使用正则表达式查找数字并排除括号中的任何数字
【发布时间】:2009-12-30 17:11:39
【问题描述】:

我正在尝试编写一个正则表达式模式,该模式将在字符串中查找带有两个前导 00 的数字,并将其替换为单个 0。问题是我想忽略括号中的数字,我想不通如何做到这一点。

例如,用字符串:

Somewhere 001 (2009)

我想回来:

Somewhere 01 (2009)

我可以使用 [00] 搜索第一个 00,然后用 0 替换,但问题是 (2009) 变成了我不想要的 (209)。我想只是用(2009)替换(209),但我试图修复的字符串可能已经有一个有效的(209)。

任何帮助将不胜感激!

【问题讨论】:

    标签: regex regex-negation


    【解决方案1】:

    搜索一个非数字(或行首),后跟两个零,后跟一个或多个数字。

    ([^0-9]|^)00[0-9]+
    

    如果数字有三个前导零怎么办?替换后您希望它有多少个零?如果您想捕获所有前导零并仅用一个替换它们:

    ([^0-9]|^)00+[0-9]+
    

    【讨论】:

    • 谢谢!通过一个小的修正,我得到了我需要的东西。我不认为将空间用作搜索的一部分。猜想太容易错过显而易见的事情了。如果有人需要它,我用来查找 00 的正则表达式模式是 ([^0-9]|^)00。
    • 这不会忽略括号中的数字。 “(0002)”失败
    • 您可以使用替换标记忽略空格。为此,您需要添加一个额外的捕获组。这是 c# oneliner:yourString = Regex.Replace(yourString, "([^0-9]|^)00+([0-9]+)", "$10$2");
    【解决方案2】:

    理想情况下,您会在后面使用否定的外观,但您的正则表达式引擎可能不支持它。这是我在 JavaScript 中要做的事情:

    string.replace(/(^|[^(\d])00+/g,"$10");
    

    这将替换任何前面没有括号或其他数字的零字符串。如果您还使用十进制数,请将字符类更改为 [^(\d.]

    【讨论】:

    • 这是最干净的方法。
    【解决方案3】:
    ?Regex.Replace("Somewhere 001 (2009)", " 00([0-9]+) ", " 0$1 ")
    "Somewhere 01 (2009)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 2016-11-27
      • 2021-11-05
      相关资源
      最近更新 更多