Java регулярное выражение: найти последнее вхождение строки с помощью Matcher.matches () - PullRequest
3 голосов
/ 29 марта 2019

У меня есть следующая строка ввода:

abc.def.ghi.jkl.mno

Количество символов точки может различаться на входе.Я хочу извлечь слово после последнего . (т.е. mno в приведенном выше примере).Я использую следующее regex и оно прекрасно работает:

String input = "abc.def.ghi.jkl.mno";
Pattern pattern = Pattern.compile("([^.]+$)");
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
    System.out.println(matcher.group(1));
}

Однако я использую стороннюю библиотеку, которая выполняет это сопоставление ( Kafka Connect , если быть точным) иЯ могу просто предоставить шаблон регулярного выражения.Проблема в том, что эта библиотека (код которой я не могу изменить) использует matches() вместо find() для сопоставления, и когда я выполняю тот же код с matches(), она не работает, например:

String input = "abc.def.ghi.jkl.mno";
Pattern pattern = Pattern.compile("([^.]+$)");
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
    System.out.println(matcher.group(1));
}

Приведенный выше код ничего не печатает.Согласно javadoc , matches() пытается соответствовать всей строке.Можно ли как-нибудь применить подобную логику, используя matches() для извлечения mno из моей входной строки?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Вы можете использовать

".*\\.([^.]*)"

Это соответствует

  • .*\. - любые 0+ символов до последнего . char
  • ([^.]*) - Группа захвата 1: любые 0+ символов, кроме точки.

См. Демонстрационную версию regex и график Regulex:

enter image description here

1 голос
/ 29 марта 2019

Чтобы извлечь слово после последнего . по вашей инструкции, вы можете сделать это без Pattern и Matcher следующим образом:

String input = "abc.def.ghi.jkl.mno";
String getMe = input.substring(input.lastIndexOf(".")+1, input.length());
System.out.println(getMe);
0 голосов
/ 29 марта 2019

Это будет работать.Используйте .* в начале, чтобы он соответствовал всему входному сигналу.

public static void main(String[] argv) {
    String input = "abc.def.ghi.jkl.mno";
    Pattern pattern = Pattern.compile(".*([^.]{3})$");
    Matcher matcher = pattern.matcher(input);
    if(matcher.matches()) {
        System.out.println(matcher.group(0));
        System.out.println(matcher.group(1));
    }
}

abc.def.ghi.jkl.mno
mno

Это лучший шаблон, если точка действительно где-то находится: ".*\\.([^.]+)$"

...