尽管匹配,但未找到Java命名捕获组
我试图使用Java的命名捕获组从字符串中提取整数。我知道还有其他更简单的方法来提取数字,但我想使用regex,因为我想确保字符串的其余部分与模式匹配尽管匹配,但未找到Java命名捕获组,java,regex,Java,Regex,我试图使用Java的命名捕获组从字符串中提取整数。我知道还有其他更简单的方法来提取数字,但我想使用regex,因为我想确保字符串的其余部分与模式匹配 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"); l
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");
line=“数据:共5个”;
模式p=模式.compile((数据:(?\\d+)总计)”;
匹配器m=p.匹配器(线);
断言m.matches();
字符串值=m.group(“值”);
上述代码返回失败,线程“main”java.lang中的异常。IllegalStateException:未找到匹配项
捕获的唯一组是完整的输入字符串,“Data:5 Total”
。
为什么内部命名组
“value”
未被捕获?在尝试访问匹配结果之前,需要调用find()
使正则表达式引擎找到匹配项。您还可以删除整个模式周围的捕获组,并参考group()以获得整个匹配
String s = "Data: 5 Total";
Pattern p = Pattern.compile("Data: (?<value>\\d+) Total");
Matcher m = p.matcher(s);
if (m.find()) {
String value = m.group("value");
// do something with the match result ...
}
String s=“数据:共5个”;
模式p=模式编译(“数据:(?\\d+)总计”);
匹配器m=匹配器p;
if(m.find()){
字符串值=m.group(“值”);
//对比赛结果做点什么。。。
}
是否有理由认为m.matches()不够充分?我觉得m.matches()隐式调用find()matches()
方法根据传递给matcher()的整个字符串匹配正则表达式。如果正则表达式匹配整个字符串,则matches()
返回true。如果没有,则返回false。但是如果在matches()
中找到匹配项,那么它不应该也在其中找到组吗?如果字符串是“Data:5 Total XQWEQWE”
,该怎么办?在这种情况下,我希望得到通知,完整字符串不匹配?我是否需要另外调用matches()
来完成此操作?不使用字符串开头^
和字符串结尾$
锚定<代码>^数据:(?\\d+)总计$
为什么要使用断言
?断言的全部要点是,可以在运行时启用或禁用断言,而无需更改结果()。它们不适用于正常的控制流。想想看,你怎么知道它捕获了完整的输入字符串?如果断言m.matches()代码>行没有被执行,m.group()
应该抛出一个非法状态异常,就像m.group(“value”)
一样。你是对的。在我写这篇文章的时候,我不明白assert
是如何工作的。我现在已经完全替换了它。@Alan我现在的理解是,我应该使用if语句,并在else块中抛出一个异常。这是否正确?您肯定应该使用if
语句,但是如果匹配失败,您是否应该抛出异常?我不知道你的代码是如何被使用的,所以我不能告诉你。