繁体   English   中英

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

[英]Java regex : find the last occurrence of a string using Matcher.matches()

我有以下输入字符串:

abc.def.ghi.jkl.mno

点字符数可能在输入中有所不同。 我想在最后一个之后提取这个词. (即上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()从我的输入String中提取mno来应用类似的逻辑?

你可以用

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

它匹配

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

请参阅正则表达式演示和Regulex图:

在此输入图像描述

在最后一个之后提取一个单词. 根据您的指示,您可以在没有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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM