使用 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
如果我使用 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
我正在尝试使用正则表达式从给定字符串中提取子字符串。我在 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
如果我使用 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