首页 > 解决方案 > 使用 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) 的问题的答案。

标签: regexscalafunctional-programmingmatcher

解决方案


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

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


推荐阅读