java Regex:用一个数字替换所有数值

时间:2011-10-12 09:29:19

标签: java regex replace digit

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

我一直在用Java中的Regex进行调整,有这样的事情:

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

但无济于事。

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

3 个答案:

答案 0 :(得分:2)

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

以下是表达式的细分:

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

  2. -?负数的潜在负数

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

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

  5. 更新

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

    这是一个细分:

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

    2. (?<![\d\./])匹配不能直接跟随数字,点或斜线 - 请注意,在数字的开头需要不遵循数字约束,否则您将匹配{{ 1}}在234

    3. .1234负数的潜在负数

    4. -?任何数字序列(至少一个)

    5. \\d+匹配必须有一个点或斜线后跟至少一个数字,或者后面跟一个数字,点或斜线,这将匹配(?:(?:[\./]\d+)|(?![\d\./]))但不匹配{ {1}} - 请注意,为了防止在1.0中匹配1.

    6. ,需要使用数字约束。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你忘了逃避了。字符。除此之外,你的模式对我来说很好。

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

如果仍然无效,请提供表达式无效的情况。