正则表达式查找包含数字的行,以文本开头,但从出现的文本中删除文本

Regex to find lines containing numbers, starting with text, but removing text from the ocurrence

有以下输入:

Testing 42702434884 
Testing 064352729-13
05.994.401/0001-53
Testing 134.632.125-03

我试图获取包含数字的行,只考虑以文本开头的行,并从结果中删除文本,

目前我尝试了以下表达式:

(?!a-zA-Z)\b(\d{11}|\d{14})|(\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b

我能够从结果中删除文本,并找到包含模式的行,但无法仅过滤以文本开头的行。 Here is the result 例如

如何在从结果中删除文本的同时过滤以文本开头的行?

对您尝试的模式使用否定前瞻 (?!a-zA-Z)\b 总是正确的,因为后面是一个数字,因此可以省略。

您可以使用锚点 ^ 来断言字符串的开头,并匹配 1+ 次字符 a-zA-Z 后跟 space 并使其可选 (?:[a-zA-Z]+ )? 如果你想匹配所有的例子

在所有交替周围附加一个组。

如果您不需要所有的捕获组,您可以让它们成为非捕获组 (?:,除了您想要保留的数字。

这些值在组 1 中。

^(?:[a-zA-Z]+ )?((?:\d{11}|\d{14})|(?:\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(?:\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b)

注意 Java 双重转义反斜杠。

Regex demo | Java demo


要仅获得 3 个匹配项,您可以使用

^[a-zA-Z]+ ((?:\d{11}|\d{14})|(?:\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(?:\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b)

Regex demo | Java demo

不太清楚您希望如何解析数字。这对你有用吗?

  1. 首先它只过滤以文本开头的行。
  2. 然后删除第一个数字之前的所有字符。
  3. 并将它们存储在数组中。
      String[] lines = {
            "Testing 42702434884", "Testing 064352729-13", "05.994.401/0001-53",
            "Testing 134.632.125-03"
      };

      String[] filtered =
            Arrays.stream(lines).filter(k -> k.matches("^\D+.*")).map(
                  s -> s.replaceAll("(^\D+)", "")).toArray(String[]::new);

      for (String s : filtered) {
         System.out.println(s);
      }

以上打印


42702434884
064352729-13
134.632.125-03