java - 重复捕获组只匹配最后一次出现

标签 java regex backtracking capturing-group

以下文本数据给出了我正在经历奇怪的捕获组行为。 当我尝试仅遍历所有表的最后一行数据时。有没有办法维护所有捕获组而不仅仅是最后一行(每个表的值)?

我正在使用这个模式 (?<tabname>\S+)\n\=*\n(?:(\d+)\ *\|\ *(\d+)\n)+

TABLE1
=======
1  | 2
15 | 2
3  | 15

TABLE2
=======
3  | 5
12 | 2
17 | 7

编辑:抱歉我的问题不一致,这里是我的预期和实际输出:

预期输出为:

第 1 场比赛,共 2 场比赛:

Group "tabname":    TABLE1
Group 2:    1
Group 3:    2
Group 4:    15
Group 5:    2
Group 6:    3
Group 7:    15

第 2 场比赛:

Group "tabname":    TABLE2
Group 2:    3
Group 3:    5
Group 4:    12
Group 5:    2
Group 6:    17
Group 7:    7

但是实际输出是:

第 1 场比赛,共 2 场比赛:

Group "tabname":    TABLE1
Group 2:    3
Group 3:    15

第 2 场比赛:

Group "tabname":    TABLE1
Group 2:    17
Group 3:    7

最佳答案

您可以分两次收集数据。第一个正则表达式将只匹配具有所有值的表:

"(?<tabledata>\\S+)\\s+\\S+(?<vals>[|\\d\\s]+)"

参见 demo .接下来,我们将匹配数字并将它们添加到字符串数组(使用简单的 \d+ 正则表达式)。

这是一个full Java demo生成 [[TABLE1, 1, 2, 15, 2, 3, 15], [TABLE2, 3, 5, 12, 2, 17, 7]]:

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "TABLE1\n=======\n1  | 2\n15 | 2\n3  | 15\n\nTABLE2\n=======\n3  | 5\n12 | 2\n17 | 7"; 
        Pattern pattern = Pattern.compile("(?<tabledata>\\S+)\\s+\\S+(?<vals>[|\\d\\s]+)");
        Matcher matcher = pattern.matcher(s);
        List<List<String>> res = new ArrayList<>();
        while (matcher.find()){
            List<String> lst = new ArrayList<>();
            if (matcher.group("tabledata") != null) {
                lst.add(matcher.group("tabledata"));
            }
            if (matcher.group("vals") != null) {
                Matcher m = Pattern.compile("\\d+").matcher(matcher.group("vals"));
                while (m.find()) {
                    lst.add(m.group(0));
                }
            }
            res.add(lst);
        } 
        System.out.println(res); 
    }
}

关于java - 重复捕获组只匹配最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37411419/

相关文章:

验证网上步行益智游戏的算法

java - 计算Java程序的执行时间

java - htop 和 top 显示进程的多个实例?

java - 使用比硬件线程更多的线程时的注意事项?

PHP 使用正则表达式验证 CRON

python - python中数字范围的正则表达式

java - 作业任务——通过int方法回溯

java - Netbeans GlassFish Server 4,部署,连接被拒绝 : connect, false ,模块尚未部署。有关详细信息,请参阅服务器日志

regex - 将 NFA 转换为正则表达式

Scala:使用迭代器的动态编程递归