在Java中使用正则表达式从String中提取子字符串(有条件)

时间:2018-10-19 15:13:57

标签: java regex

我需要使用正则表达式从字符串中提取子字符串。棘手的(对我而言)部分是字符串可能采用以下两种格式之一:

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中执行此操作,但是重点在于使用正则表达式。

2 个答案:

答案 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