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));
}
上面的代码不会打印任何内容。根据javadoc,matches()
尝试匹配整个String。有什么方法可以使用matches()
从我的输入字符串中提取mno
来应用类似的逻辑吗?
答案
你可以用
".*.([^.]*)"
它匹配
.*.
- 尽可能多的0个字符,直到最后一个.
字符([^.]*)
- 捕获组1:除点之外的任何0+字符。
请参阅regex demo和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
如果点确实在任何地方,这是一个更好的模式:".*.([^.]+)$"
以上是关于Java正则表达式:使用Matcher.matches()查找字符串的最后一次出现的主要内容,如果未能解决你的问题,请参考以下文章