2

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

我一直在摆弄 Java 中的 Regex,如下所示:

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

但无济于事。

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

4

3 回答 3

2

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

下面是表达式的细分:

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

  2. -?负数的潜在负数

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

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

更新

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

这里再次细分:

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

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

  3. -?负数的潜在负数

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

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

于 2011-10-12T09:32:52.927 回答
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"

请参阅演示

于 2011-10-12T09:38:19.417 回答
0

你忘记了逃避。特点。除此之外,你的模式对我来说看起来不错。

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

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

于 2011-10-12T09:38:33.083 回答