![](/img/trans.png)
[英]Java Regex Pattern Matcher.matches() before Matcher.find() Strange behaviour
[英]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));
}
上面的代码不会打印任何内容。 根据javadoc , matches()
尝试匹配整个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.