繁体   English   中英

Java模式与RegEx不匹配

[英]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.

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