Извлечение подстроки из String с помощью регулярного выражения в Java (с условием) - PullRequest
0 голосов
/ 19 октября 2018

Мне нужно извлечь подстроку из строки с помощью регулярных выражений.Сложность (для меня) заключается в том, что строка может иметь один из двух форматов:

либо LLDDDDLDDDDDDD / 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 голосов
/ 19 октября 2018

Вы можете использовать String.replaceAll для удаления нецифровых символов:

String extracted = new String("AB1000G242424/001").replaceAll("[^0-9]","");
if (extracted.length() > 7)
    extracted = extracted.substring(0, 7);

Вывод:

1000242
0 голосов
/ 19 октября 2018

Регулярное выражение является второстепенной проблемой, цифры должны сравниваться по длине.Как в регулярном выражении \d означает цифра и \D для не цифра , вы можете использовать String.splitAsStream следующим образом:

Optional<String> digits takeDigits(String s) {
    return s.splitAsStream("\\D+")
        filter(w -> !w.isEmpty() && w.length() <= 7)
        max(Comparator.comparingInt(String::length));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...