我需要使用正则表达式从字符串中提取子字符串。棘手的(对我而言)部分是字符串可能采用以下两种格式之一:
LLDDDDLDDDDDDDDD / DDD(例如AB1000G242424 / 001)或1到7位数字(例如242424)之间。
我需要提取的子字符串必须是: 如果字符串是7位或更长,则提取由7位数字组成的子字符串。 否则(如果字符串短于7位数字),则提取由1-6位数字组成的子字符串。
下面是我的尝试之一。
String regex = ("([0-9]{7}|[0-9]{0,6})");
Pattern pattern = Pattern.compile(regex);
Matcher matcher;
matcher = pattern.matcher("242424");
String extractedNr1 = "";
while (matcher.find()) {
extractedNr1 += matcher.group();
}
matcher = pattern.matcher("AB1000G242424/001");
String extractedNr2 = "";
while (matcher.find()) {
extractedNr2 += matcher.group();
}
System.out.println("ExtractedNr1 = " + extractedNr1);
System.out.println("ExtractedNr2 = " + extractedNr2);
输出:
ExtractedNr1 = 242424
ExtractedNr2 = 1000242424001
我知道第二个是所有小组的比赛,但是不明白为什么比赛会这样排列。我可以制作一个匹配后立即停止的正则表达式吗(第一个选项的优先级为7位)? 我曾考虑过使用一些条件语句,但显然在java.util.regex中不支持这些条件语句,并且我无法使用第三方库。 我显然可以在Java中执行此操作,但是重点在于使用正则表达式。
答案 0 :(得分:1)
正则表达式是一个附属问题,必须按长度比较数字的出现。就像在正则表达式中,\d
代表 digit 和\D
代表 non-digit 一样,您可以按以下方式使用String.splitAsStream
:
Optional<String> digits takeDigits(String s) {
return s.splitAsStream("\\D+")
filter(w -> !w.isEmpty() && w.length() <= 7)
max(Comparator.comparingInt(String::length));
}
答案 1 :(得分:0)
您可以使用String.replaceAll删除非数字字符:
String extracted = new String("AB1000G242424/001").replaceAll("[^0-9]","");
if (extracted.length() > 7)
extracted = extracted.substring(0, 7);
输出:
1000242