使用 Matcher 提取子字符串:java.lang.IllegalStateException:找不到匹配项

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 作为第 1 组值也就不足为奇了。见 Repeating a Capturing Group vs. Capturing a Repeated Group.

其次,您实际上并未调用实际触发正则表达式搜索的匹配器 .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 demo

如果我使用 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

您可以检查this excellent tutorial on Regex, by Oracle