Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尽管匹配,但未找到Java命名捕获组_Java_Regex - Fatal编程技术网

尽管匹配,但未找到Java命名捕获组

尽管匹配,但未找到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

我试图使用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");
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
语句,但是如果匹配失败,您是否应该抛出异常?我不知道你的代码是如何被使用的,所以我不能告诉你。