#java #regex
Вопрос:
Я собираюсь извлечь числа из строки. Числа представляют собой версию. Это означает, что я собираюсь сопоставлять числа, которые находятся между:
_
и/
/
и/
Я подготовил следующее регулярное выражение, но оно работает не так, как ожидалось:
.*[/_](d{1,2}[.]d{1,2}[.]d{1,2})/.*
В следующем примере регулярное выражение должно совпадать дважды:
Ввод: name_1.1.1/9.10.0/abc
. Ожидаемый результат: 1.1.1
и 9.10.0
, но только мое регулярное выражение возвращается 9.10.0
, 1.1.1
опущено. Ты хоть представляешь, в чем дело?
Комментарии:
1. почему бы просто
(d .d .d)
не найти группы, которые соответствуют
Ответ №1:
Вы можете просто разделить строку на _
или /
, а затем сохранить компоненты, которые кажутся версиями:
List<String> versions = new ArrayList<>();
String input = "name_1.1.1/9.10.0/abc";
String[] parts = input.split("[_/]");
for (String part : parts) {
if (part.matches("\d (?:\.\d )*")) {
versions.add(part);
}
}
System.out.println(versions); // [1.1.1, 9.10.0]
Ответ №2:
Вы можете утверждать /
это в конце, а не сопоставлять его, и опустить .*
Обратите внимание, что вам не нужно избегать /
[/_](d{1,2}[.]d{1,2}[.]d{1,2})(?=/)
Демонстрация регулярных выражений | Демонстрация Java
Пример кода
String regex = "[/_](\d{1,2}[.]\d{1,2}[.]\d{1,2})(?=/)";
String string = "name_1.1.1/9.10.0/abc";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
Выход
1.1.1
9.10.0
Другим вариантом может быть использование положительного взгляда сзади, чтобы указать либо a /
, либо _
влево и получить только совпадение.
(?<=[/_])d{1,2}[.]d{1,2}[.]d{1,2}(?=/)
Ответ №3:
String regex = "(\d .\d .\d )";
String string = "name_1.1.1/9.10.0/abc";
String string2 = "randomversion4.5.6/09.7.8_9.88.9";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
Matcher matcher2 = pattern.matcher(string2);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
while (matcher2.find()) {
System.out.println(matcher2.group(1));
}
Из:
1.1.1
9.10.0
4.5.6
09.7.8
9.88.9
Просто напишите регулярное выражение для того, что вы хотите сопоставить. В данном случае просто номер версии.
Регулярное выражение можно использовать для сопоставления целых строк или для определения наличия подстроки в строке.
При использовании регулярного выражения для поиска подстроки вы не всегда можете сопоставить все имена файлов или любую строку. Следовательно, совпадайте только с тем, что вы хотите найти. Таким образом, вы можете найти версии независимо от того, в какой строке они находятся.