正则表达式中的 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
我需要从字符串中提取以下模式,并根据输入 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