Вы можете использовать
Pattern pattern = Pattern.compile(".*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)");
См. Демонстрационную версию regex
При использовании с matches()
приведенный выше шаблон не требует явных привязок, ^
и $
.
Подробности
.*
- любые 0+ символов, кроме символов разрыва строки, как можно больше /
- самый правый /
, за которым следуют последующие подшаблоны (?:a-b|c-d|e-f)
- группа без захвата, соответствующая любой из альтернатив внутри: a-b
, c-d
или e-f
/
- /
char [^/]*?
- любые символы, кроме /
, как можно меньше ([0-9]+)
- Группа 1:одна или несколько цифр.
Java demo :
List<String> strs = Arrays.asList("foo/bar/Samsung-Galaxy/a-b/1","foo/bar/Samsung-Galaxy/c-d/1#P2","foo.com/Samsung-Galaxy/9090/c-d/69");
Pattern pattern = Pattern.compile(".*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)");
for (String s : strs) {
Matcher m = pattern.matcher(s);
if (m.matches()) {
System.out.println(s + ": \"" + m.group(1) + "\"");
}
}
Подход с заменой с использованием того же регулярного выражения с добавленными якорями:
List<String> strs = Arrays.asList("foo/bar/Samsung-Galaxy/a-b/1","foo/bar/Samsung-Galaxy/c-d/1#P2","foo.com/Samsung-Galaxy/9090/c-d/69");
String pattern = "^.*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)$";
for (String s : strs) {
System.out.println(s + ": \"" + s.replaceFirst(pattern, "$1") + "\"");
}
См. еще одну демонстрацию Java .
Вывод:
foo/bar/Samsung-Galaxy/a-b/1: "1"
foo/bar/Samsung-Galaxy/c-d/1#P2: "2"
foo.com/Samsung-Galaxy/9090/c-d/69: "69"