Java正则表达式:使用Matcher.matches()查找字符串的最后一个匹配项

3

我有以下的输入字符串:

abc.def.ghi.jkl.mno

输入中的点字符数可能会有所变化。 我想提取最后一个 . 后面的单词(即上面示例中的 mno )。 我正在使用以下 正则表达式 ,它完全正常运行:

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

1
使用 .*\.(.+) 并获取第一组的值。 - Wiktor Stribiżew
听起来你在描述两个不同的问题。你是在提取还是匹配?还是两者都有?因为仅使用matches()无法提取任何内容。 - shmosel
你想要mno吗? :-) - MS90
".\.([^.])" 应该可以。 - user85421
@WiktorStribiżew 非常好。您能将其添加为答案吗?然后我会接受它。 - Darshan Mehta
3个回答

2

You may use

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

它匹配

  • .*\. - 任意0+个字符,尽可能多地匹配到最后一个.字符
  • ([^.]*) - 捕获组1:除了点号之外的任意0+个字符。

查看正则表达式演示和Regulex图:

enter image description here

原始答案翻译为“最初的回答”


1
根据您的指示,提取最后一个 . 后面的单词时,可以按照以下方式进行,无需使用 Pattern 和 Matcher:
String input = "abc.def.ghi.jkl.mno";
String getMe = input.substring(input.lastIndexOf(".")+1, input.length());
System.out.println(getMe);

1
我同意这个观点。.matches返回一个布尔值,因此它只会告诉你是否有匹配项。您仍然可以使用matches确认是否存在任何“.”字符,然后使用上面的代码进行提取。 - MGT

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

如果点号确实可以出现在任何位置,那么这是一个更好的模式:".*\\.([^.]+)$"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接