Java正则表达式:使用Matcher.matches()查找字符串的最后一次出现

时间:2019-03-28 22:45:40

标签: java regex regex-greedy

我有以下输入字符串:

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));
}

上面的代码不打印任何内容。根据{{​​3}},matches()尝试匹配整个字符串。我有什么方法可以使用matches()来从输入字符串中提取mno来应用类似的逻辑?

3 个答案:

答案 0 :(得分:2)

您可以使用

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

它匹配

  • .*\.-最多0个字符,直至最后.个字符
  • ([^.]*)-捕获组1:点以外的任何0+个字符。

请参见regex demo和Regulex图:

enter image description here

答案 1 :(得分:1)

要根据您的指令提取最后一个.之后的单词,您可以在没有Pattern和Matcher的情况下执行以下操作:

String input = "abc.def.ghi.jkl.mno";
String getMe = input.substring(input.lastIndexOf(".")+1, input.length());
System.out.println(getMe);

答案 2 :(得分:0)

这将起作用。在开头使用.*使其与整个输入匹配。

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

如果圆点确实在任何地方,这是一个更好的模式:".*\\.([^.]+)$"