【问题标题】:Java Pattern does not match RegExJava 模式与正则表达式不匹配
【发布时间】:2017-09-23 15:08:39
【问题描述】:

我有以下 Java 代码应该从 String 对象中提取 url

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 有什么问题?

【问题讨论】:

  • 字符串正则表达式 = "https:\/\/some\\.domain\\.com/subfolder[^]*";
  • @lordkain 为什么要避开斜线?
  • @lordkain 这是一个非法的转义序列。此外,我还尝试了简单的https.* 也失败了。
  • 我认为你不能在不先调用 find 或 matches 方法的情况下使用 'group'。
  • if(m.matches()){ String url = m.group(); System.out.println(url); IllegalStateException - 如果尚未尝试匹配,或者之前的匹配操作失败

标签: java regex


【解决方案1】:

您不能要求Matcher 提供.group(),除非您调用了一个要求Matcher 对输入进行操作的方法:.find()(首选)、.lookingAt() 或@ 之一987654326@.

这就是您收到IllegalStateException 的原因。

至于三者之间的区别,javadoc 说明了一切,只是快速提醒一下:

  • .find() 进行“真正的”正则表达式匹配:它会尝试匹配输入文本中任何位置的正则表达式;
  • .lookingAt() 在输入文本的开头添加模式应该匹配的约束;
  • .matches() 用词不当,因为除了 .lookingAt() 施加的约束外,它还要求匹配完整的输入文本(javadoc 中的“整个区域”)。

还请记住,这三个方法根据匹配是否成功返回布尔值;如果结果是false,则不能.group()

【讨论】:

    【解决方案2】:

    m.group()

    返回上一个匹配匹配的输入子序列。

    您必须先致电m.matches()m.find(),然后才能使用m.group()

    【讨论】:

      【解决方案3】:

      您忘记致电m.find()m.matches()。这是强制性的,否则group() 不起作用。

      如果模式匹配,find() 应该返回 true。只有在这种情况下,group() 才会返回您所期望的。

      所以,修改你的代码如下:

      ....
      if (!m.find()) {
          return;
      }
      String url = m.group();
      ...
      

      编辑 关于调用什么方法:find()matches()find() 在字符串的一部分中查找模式,matches() 匹配完整的字符串。它们与字符串的contains()equals() 相关。

      我个人更喜欢使用find(),因为在这种情况下,正则表达式完全定义了行为。如果我想匹配完整的字符串,我使用^$

      【讨论】:

      • 你忘了.lookingAt()
      猜你喜欢
      • 2019-10-08
      • 1970-01-01
      • 2016-04-24
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多