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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java正则表达式:使用Matcher.matches()查找字符串的最后一次出现相关的知识,希望对你有一定的参考价值。

我有以下输入字符串:

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

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

答案

你可以用

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

它匹配

  • .*. - 尽可能多的0个字符,直到最后一个.字符
  • ([^.]*) - 捕获组1:除点之外的任何0+字符。

请参阅regex demo和Regulex图:

enter image description here

另一答案

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

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

这会奏效。在开头使用.*使其匹配整个输入。

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

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

以上是关于Java正则表达式:使用Matcher.matches()查找字符串的最后一次出现的主要内容,如果未能解决你的问题,请参考以下文章

java正则表达式

java 正则表达式

java正则表达式中[&&]用法

Java中正则表达式的问题

java中正则表达式如何使用?比如判断一个字符串是不是满足某种格式,给个详细点的例子

使用Java操作正则表达式