正则表达式中的 replaceFirst 为 $1 - JAVA

replaceFirst in a regex with $1 - JAVA

我需要从字符串中提取以下模式,并根据输入 return 可能的匹配项之一。

我使用正则表达式,通过不同的可能性,但我没有得到预期的结果:

输入a): 71346 G249 USD 70045620 27/08/2020 001 / 004

输入 b): 71346 G249 USD 70045620/2020 27/08/2020 001 / 004

试一试

String result = data.replaceFirst ( "(.*?([0-9]{6,}\/[0-9]{4}).*)|(.*?([0-9]{6,}).*)", "" );

尝试两个

String result = data.replaceFirst ( ".*?([0-9]{6,}\/[0-9]{4})|([0-9]{6,}).*", "" );

尝试三个

String result = data.replaceFirst ( ".*?([0-9]{6,})([0-9]{6,}\/[0-9]{4}).*", "" );

根据输入的预期结果:

输入a): 70045620

输入 b): 70045620/2020

我会在此处使用 String#replaceAll 来处理此问题:

String[] inputs = { "71346 G249 USD 70045620 27/08/2020 001 / 004",
                    "71346 G249 USD 70045620/2020 27/08/2020 001 / 004" };
for (String input : inputs) {
    String match = input.replaceAll(".*\b(\d{8}(?:/\d{4})?)\b.*", "");
    System.out.println(input + " => " + match);
}

这会打印:

71346 G249 USD 70045620 27/08/2020 001 / 004 => 70045620
71346 G249 USD 70045620/2020 27/08/2020 001 / 004 => 70045620/2020

就我个人而言,我会避免为此使用正则表达式。 好像你只想要第四个字。像 string.split() 这样的东西可能没问题:

import java.io.*; 

public class HelloWorld{

     public static void main(String []args){
        String text = "71346 G249 USD 70045620 27/08/2020 001 / 004";
        String result = text.split(" ")[3];
        System.out.print(result); 
     }
}

以上程序将输出:第一个输入 70045620,第二个输入 70045620/2020

以这种方式使用交替捕获组将根据数据为您提供不同的组号。如果你想在替换中使用单个组,你可以将第二部分设为可选。

String[] strings = { 
    "71346 G249 USD 70045620 27/08/2020 001 / 004",
    "71346 G249 USD 70045620/2020 27/08/2020 001 / 004"
};
String regex = "^.*?\b([0-9]{6,}(?:/[0-9]{4})?)\b.*$";

for (String s : strings) {
    System.out.println(s.replaceFirst(regex, ""));
}

看到一个Java demo

输出

70045620
70045620/2020

您也可以找到匹配项而不是使用 replaceFirst。

\b[0-9]{6,}(?:/[0-9]{4})?

例如

String[] strings = { 
    "71346 G249 USD 70045620 27/08/2020 001 / 004",
    "71346 G249 USD 70045620/2020 27/08/2020 001 / 004"
};
String regex = "\b[0-9]{6,}(?:/[0-9]{4})?";    
Pattern pattern = Pattern.compile(regex);    

for (String s : strings) {
    Matcher matcher = pattern.matcher(s);
    if (matcher.find()) {
        System.out.println(matcher.group(0));
    }
}

再看一个Java demo

输出

70045620
70045620/2020