【问题标题】:matcher.find() regex Java functionmatcher.find() 正则表达式 Java 函数
【发布时间】:2020-11-25 16:09:50
【问题描述】:

考虑以下检查输入是否为格式的代码:<tag>contents</tag> 如果以上述形式输入,则在标签之间打印内容,否则打印无。

例如:

  1. 输入:<h1>Nayeem loves counseling</h1> 输出:Nayeem 喜欢咨询

  2. 输入:<h1><h1>Sanjay has no watch</h1></h1><par>So wait for a while</par> 输出:桑杰没有手表 所以请稍等

  3. 输入:<Amee>safat codes like a ninja</amee> 输出:无

String line = scan.nextLine();

boolean matchFound = false;
Pattern r = Pattern.compile("<(.+)>([^<]+)</\\1>");
Matcher m = r.matcher(line);

while(m.find()) {
    System.out.println(m.group(2));
    matchFound = true;
}

if(!matchFound) {
    System.out.println("None");
}

这里 find() 返回布尔类型。我的问题是为什么 find() 应该与 while 循环一起使用?为什么我不能用“if”代替while? find 在内部如何工作?

【问题讨论】:

  • 如果你使用if,第二个输入示例只会打印一个结果(我认为)。如果您想找到所有匹配项,而不仅仅是第一个匹配项,while 是必需的。
  • while 循环的主体运行零次或多次; if 语句的主体运行零次或一次。它们之间的选择取决于您希望找到多少匹配项。

标签: java regex find pattern-matching matcher


【解决方案1】:

当您调用find() 时,匹配器将尝试查找与您的正则表达式模式匹配的下一个序列。通过在while循环中使用find(),您将能够获得所有匹配的序列(如果有的话)。如果要整体匹配输入字符串,可以使用matches()

参考:

find method in Java Docs

matches method in Java Docs

【讨论】:

    【解决方案2】:

    答案在javadoc for find

    public boolean find()

    尝试查找与模式匹配的输入序列的下一个子序列。

    此方法从该匹配器区域的开头开始,或者,如果该方法的先前调用成功并且匹配器尚未重置,则从前一个匹配不匹配的第一个字符开始.

    如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

    您正在查看的代码是重复查找正则表达式的下一个匹配项并打印其匹配的第二组。由于匹配的第二组是标签内容,这会打印所有标签的内容。

    如果您使用if 而不是while,则只会打印第一个匹配项;即只有第一个标签的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 2015-12-29
      • 1970-01-01
      • 2016-09-28
      • 2013-01-18
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多