从带有正则表达式的String获取最后n个匹配项

时间:2014-01-31 15:52:40

标签: java regex string

我有一个不带任何关闭标记(</.*?>)并且没有任何新行(\n)的HTML字符串:

<tr><td align=center>01/01/2001<td align=center>500,01<td align=center>0,99<td align=center>15

这无限期重复,并且可能有1或更多td的值。 目前我正在使用String.split("<tr><td align=center>")来分隔字符串,然后使用一个正则表达式来查找日期,并使用一个正则表达式找到我想要的值。

这样的事情:

String[] stringArray = text.split("<tr><td align=center>");

        String[] array1 = Arrays.copyOfRange(stringArray, stringArray.length - /*0<n<21*/,
                stringArray.length);

        for (int i = 0; i < array1.length; i++) {
            System.out.println(array1[i]);
            m1 = Pattern.compile("(\\d{2}\\/\\d{2}\\/\\d{4})").matcher(
                    array1[i]);

            //getting date
            m1.find();
            System.out.println(m1.group(1));

            m1 = Pattern.compile("<td align=center>(\\d+,*\\d*)").matcher(array1[i]);
            while (m1.find()) {
                System.out.println(m1.group(/*0<n*/));
            }
        }

我想要一种方法来获得一个相当于array1的字符串(字符串的最后n个位置)但使用正则表达式。

我知道我可以在最后使用$更大的正则表达式来获取最后一个<tr>,但我希望在它之前得到所有19 <tr>

我不知道我在这里是否清楚。如果我能提供更多细节,请告诉我。

PS:是的,值是用','而不是'。'来写的。我稍后会使用替换。

1 个答案:

答案 0 :(得分:1)

使用Java正则表达式,您无法将任意数量的匹配项收集到一个组中,因此除非您知道组的确切/最大数量,否则您必须多次应用正则表达式并自行收集匹配项。 / p>

顺便说一句,你应该在调用m1.find();之前检查m1.group(1);是否返回true,否则如果表达式不匹配你会得到IllegalStateException。

另外请注意,我会在循环外编译日期模式,可能是在一些初始化代码中。