java regex:是否可以在没有循环的情况下找到匹配中的捕获数量

时间:2014-12-05 04:51:09

标签: java regex

我的代码看起来像这样,它可以很好地找到矩阵中的所有数字但对我来说似乎过于复杂。

String attr = "matrix(1 0 0 1 22.51 35)";
Pattern nums = Pattern.compile("(-*\\d+(?:\\.\\d+)*)");
Matcher m2 = nums.matcher(attr);
while(m2.find()) {
   Log.i(logTag, "s = " + m2.group(0));
}

我想分配一个数组,然后为它赋值,这样我就可以做:

Pattern nums = Pattern.compile("(-*\\d+(?:\\.\\d+)*)");
Matcher m2 = nums.matcher(attr);
String [] matches = new String[number_of_matches];
int index = 0;
while (m2.find()) {
    matches[index++] = m2.groups(0);
}

这可能吗?我已经查了好几个小时,在原生java中找不到这样的东西,但是我发现了几个示例代码来实现这个功能但是我希望在regex库中找到它。

在PERL中,我的代码看起来像:

$s = "matrix(1 0 0 1 22.51 35)";
@x = ($s =~ m{(\d+(?:\.\d+)*)}g);

x @x
0  1
1  0
2  0
3  1
4  22.51
5  35

3 个答案:

答案 0 :(得分:2)

不,没有该功能的方法。 如果它存在,它将完全按照你描述的方式执行:遍历所有匹配并计算它们(然后重置为字符串的开头)

如果你真的需要事先知道,你可以自己编写计数功能。

但我建议您使用List(例如ArrayList)而不是数组;那么你不需要预先知道匹配的数量,List界面通常使用比数组更方便。

(你的Perl结果还会返回一个可变大小的列表,而不是一个固定大小的数组,如果我的生锈Perl知识没有被误解的话)

答案 1 :(得分:1)

无论如何,您应该使用List界面进行这些类型的操作。

Pattern nums = Pattern.compile("(-*\\d+(?:\\.\\d+)*)");
Matcher m2 = nums.matcher(attr);
List <String> matches = new ArrayList<String>();
while (m2.find()) {
    matches.add(m2.groups(0));
}

答案 2 :(得分:0)

你不能这样做,用find()开始扫描你手头上不太了解的String。只有匹配成功,您才能从文档中了解更多信息

  

如果匹配成功,则可以通过获得更多信息   开始,结束和分组方法,以及随后的调用   find()方法将从与此不匹配的第一个字符开始   匹配。