[英]Java Pattern does not match RegEx
我有以下Java代码,应该从String对象中提取网址
public static void main() {
String text = "Link to https://some.domain.com/subfolder?sometext is available";
String regex = "https://some\\.domain\\.com/subfolder[^ ]*";
Pattern urlPattern = Pattern.compile(regex);
Matcher m = urlPattern.matcher(text);
String url = m.group();
System.out.println(url);
return;
}
但是,没有匹配项,并且代码因IllegalStateException
而失败。
RegEx有什么问题?
你不能要求一个Matcher
给一个.group()
除非你有人称它要求的方法Matcher
对输入进行操作:一个.find()
首选), .lookingAt()
或.matches()
这就是为什么您收到IllegalStateException
。
关于这三者之间的区别,尽管javadoc告诉了它们所有内容,但是请快速提醒一下:
.find()
“真实的”正则表达式匹配:它将尝试匹配输入文本中任何位置的正则表达式; .lookingAt()
添加了约束,即模式应在输入文本的开头匹配; .matches()
是错误的称呼,因为除了.lookingAt()
施加的约束之外,它还要求匹配完整的输入文本 (javadoc中的“整个区域”)。 还请记住,这三个方法根据匹配是否成功返回一个布尔值。 如果结果为false
,则不能.group()
。
您忘记了调用m.find()
或m.matches()
。 这是强制性的,否则group()
不起作用。
如果模式匹配,则find()
应该返回true
。 只有在这种情况下, group()
才会返回您期望的结果。
因此,如下修改您的代码:
....
if (!m.find()) {
return;
}
String url = m.group();
...
编辑关于调用什么方法: find()
或matches()
。 find()
在字符串的一部分中查找模式, matches()
匹配整个字符串。 它们之间的关系就像字符串的contains()
和equals()
。
我个人更喜欢使用find()
因为在这种情况下,正则表达式完全定义了行为。 如果要匹配完整字符串,请使用^
和$
。
由于m.group()
返回与前一个匹配项匹配的输入子序列。
您必须在使用m.group()
之前调用m.matches()
或m.find()
m.group()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.