【问题标题】:java Regex: replace all numerical values with one numberjava Regex:用一个数字替换所有数值
【发布时间】:2011-10-12 09:29:18
【问题描述】:

我有一行简单的文本,其中可能包含“12.3”或“1983”或“5/8”等数字。 每当出现任何数字时,我只需要用固定字符替换,比如数字“8”。

我一直在摆弄 Java 中的 Regex,像这样:

String line = str.replaceAll("[0-9]+/*.*[0-9]*", "8");

但无济于事。

知道正确的模式应该是什么吗?

【问题讨论】:

    标签: java regex replace digit


    【解决方案1】:

    试试这个表达式:(?>-?\d+(?:[\./]\d+)?),记住在 Java 字符串中你需要转义反斜杠,即你会得到"(?>-?\\d+(?:[\\./]\\d+)?)"

    下面是表达式的细分:

    1. 封闭的(?>...) 是一个原子组,用于防止灾难性的回溯。对于简单或短字符串,它也可以不使用。

    2. -? 负数的潜在负数

    3. \d+任何数字序列(至少一个)

    4. (?:[\./]\d+)? 一个可选的非捕获组,由一个点(请注意,您不需要在这里转义它,这只是为了保持一致性)或一个斜线后跟至少一个数字组成。

    更新

    如果您不想替换“数字”,例如 .12341234. /15/(左或右缺少一个数字),请尝试以下表达式:(?>(?<![\d\./])-?\d+(?:(?:[\./]\d+)|(?![\d\./])))

    这里再次细分:

    1. 封闭的(?>...) 是一个原子组,用于防止灾难性的回溯。对于简单或短字符串,它也可以不使用。

    2. (?<![\d\./]) 匹配项不能直接跟在数字、点或斜杠之后 - 请注意,在数字开头需要匹配不跟在数字后面的约束,否则您将匹配 234 in .1234

    3. -? 负数的潜在负数

    4. \\d+任何数字序列(至少一个)

    5. (?:(?:[\./]\d+)|(?![\d\./])) 匹配必须有一个点或斜线后跟至少一个数字,或者后面不能有数字、点或斜线,这将匹配 1.0 但不匹配 1. - 注意需要不跟随数字约束以防止在1234. 中匹配123

    【讨论】:

      【解决方案2】:

      如果您只需要用一个字符替换整个数字,请使用以下代码:

      import java.io.*;
      
      class Moo
      {
        public static void main(String[] args)
        {
          String vals[] = { "1.2", "-3.14", "100500" };
          for (String s : vals)
          System.out.println(s.replaceAll("(-)?\\d+(\\.\\d*)?", "x"));
        }
      }
      

      但是如果你需要替换每个数字,你应该使用不同的正则表达式,比如这个:"\\d"

      请参阅demo

      【讨论】:

        【解决方案3】:

        你忘记逃避 .特点。除此之外,我觉得你的模式很好。

        String line = str.replaceAll("[0-9]+/*\\.*[0-9]*", "8");
        

        如果这仍然不起作用,请提供表达式无法正常工作的情况。

        【讨论】:

        • 同意,但根据我的经验,这种行为很少有问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多