【发布时间】:2014-12-25 23:55:51
【问题描述】:
我正在尝试使用 Java 的命名捕获组从字符串中提取整数。我知道还有其他更简单的方法可以仅提取数字,但我想使用正则表达式,因为我想确保字符串的其余部分与模式匹配。
line = "Data: 5 Total";
Pattern p = Pattern.compile("(Data: (?<value>\\d+) Total)");
Matcher m = p.matcher(line);
assert m.matches();
String value = m.group("value");
以上代码失败返回,Exception in thread "main" java.lang.IllegalStateException: No match found
唯一被捕获的组是完整的输入字符串"Data: 5 Total"。
为什么内部命名组"value" 未被捕获?
【问题讨论】:
-
你为什么要使用
assert?断言的全部意义在于可以在运行时启用或禁用它们而不更改结果 (ref)。它们不是用于正常的控制流。想一想,你怎么知道它正在捕获完整的输入字符串?如果assert m.matches();行没有被执行,m.group()应该像m.group("value")一样抛出一个 IllegalStateException。 -
你是对的。在我写这篇文章的时候,我不明白
assert是如何工作的。我现在已经完全替换了它。 -
@Alan 我现在的理解是,我应该改用 if 语句并在 else 块中抛出异常。这是正确的吗?
-
您绝对应该使用
if语句,但是如果匹配失败,您应该抛出异常吗?我不知道你的代码是如何被使用的,所以我不能告诉你。