【问题标题】:Java regex : find the last occurrence of a string using Matcher.matches()Java 正则表达式:使用 Matcher.matches() 查找字符串的最后一次出现
【发布时间】:2019-08-19 20:03:14
【问题描述】:

我有以下输入字符串:

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));
}

上面的代码不打印任何东西。根据javadocmatches() 尝试匹配整个字符串。有什么方法可以使用matches() 应用类似的逻辑从我的输入字符串中提取mno

【问题讨论】:

  • 使用 .*\.(.+) 并获取第 1 组值。
  • 听起来你在描述两个不同的问题。你是提取还是匹配?或两者?因为 matches() 单独不会提取任何东西。
  • 你想要mno吗? :-)
  • ".*\\.([^.]*)" 应该这样做
  • @WiktorStribiżew 效果很好。您可以将此添加为答案吗?然后我会接受。

标签: java regex regex-greedy


【解决方案1】:

你可以使用

".*\\.([^.]*)"

匹配

  • .*\. - 任何 0+ 个字符,直到最后一个 . char
  • ([^.]*) - 捕获组 1:除点外的任何 0+ 个字符。

查看regex demo 和 Regulex 图:

【讨论】:

    【解决方案2】:

    这会奏效。在开头使用.*,使其能够匹配整个输入。

    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
    

    如果点真的在任何地方,这是一个更好的模式:".*\\.([^.]+)$"

    【讨论】:

      【解决方案3】:

      要根据您的指令在最后一个 . 之后提取一个单词,您可以在没有 Pattern 和 Matcher 的情况下执行此操作,如下所示:

      String input = "abc.def.ghi.jkl.mno";
      String getMe = input.substring(input.lastIndexOf(".")+1, input.length());
      System.out.println(getMe);
      

      【讨论】:

      • 我同意这一点。 .matches 返回一个布尔值,所以它只会告诉你是否匹配。您仍然可以使用匹配来确认是否有任何“。”字符,然后使用上面的代码提取。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 2021-12-30
      • 2016-11-24
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多