繁体   English   中英

使用 Matcher 提取子字符串:java.lang.IllegalStateException: No match found

[英]Extracting a substring using Matcher: java.lang.IllegalStateException: No match found

我正在尝试使用正则表达式从给定字符串中提取子字符串。 我在 Scala 中这样做:

val pattern = Pattern.compile("(Word)+")
val matcher = pattern.matcher("WordWordRestOfString")
matcher.group(1)

所需的输出是“WordWord”,但是,我不断收到 IllegalStateException。 我以前没有真正使用过 Regex,也无法完全掌握 matcher.group 方法的工作原理,但我看到了建议使用 matcher.group(1) 的问题的答案。

首先,重复捕获组仅将最后捕获的值保留在组内存缓冲区中,因此您将Word作为 Group 1 值也就不足为奇了。 请参阅重复捕获组与捕获重复组

其次,您实际上并未调用实际触发正则表达式搜索的匹配器.find.matches方法。

第三,您不需要在此处获取 Group 1 值,您只需要获取完整匹配:

val s = "WordWordRestOfStringWordWordWord"
val pattern = "(Word)+".r
// Single result:
val result = pattern.findFirstMatchIn(s).get
println(result) // => WordWord
// Multiple results:
val multiple_results = pattern.findAllMatchIn(s)
println(multiple_results.mkString(", ")) // => WordWord, WordWordWord

查看Scala 演示

如果我使用group()而不是group(1) ,我不会遇到在Java中获得所需输出的任何问题。 我不知道 Scala,但我相信 Java 代码应该以与 Scala 相同的方式工作。

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        var pattern = Pattern.compile("(Word)+");
        var matcher = pattern.matcher("WordWordRestOfString");
        if (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

输出:

WordWord

您可以查看Oracle 编写的有关 Regex 的优秀教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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