java - REGEX 未按预期在 JAVA 程序中工作

标签 java regex

我一直在开发一个使用正则表达式的程序。它会搜索文件中的一些文本,为我提供一个基于不同玩家得分的数据库。

以下是其搜索的文本示例。

    ISLAMABAD UNITED 1st innings

Player              Status                        Runs  Blls  4s   6s    S/R
David Warner        lbw            b. Hassan       19    16    4    0  118.8%
Joe Burns                          b. Morkel       73   149   16    0   49.0%
Kane Wiliiamson                    b. Tahir       135   166   28    2   81.3%
Asad Shafiq         c. Rahane      b. Morkel       22    38    5    0   57.9%
Kraigg Braithwaite  c. Khan        b. Boult        24    36    5    0   66.7%
Corey Anderson                     b. Tahir        18    47    3    0   38.3%
Sarfaraz Ahmed                     b. Morkel        0     6    0    0    0.0%
Tim Southee         c. Hales       b. Morkel        0     6    0    0    0.0%
Kyle Abbbott        c. Rahane      b. Morkel       26    35    4    0   74.3%
Steven Finn         c. Hales       b. Hassan       10    45    1    0   22.2%
Yasir Shah          not out                         1    12    0    0    8.3%

 Total:  338/10       Overs:  92.1         Run Rate:  3.67     Extras:  10 

                             Day 2  10:11 AM


                                     -X-

我正在使用以下正则表达式来获取不同的字段..

((?:\/)?(?:[A-Za-z']+)?\s?(?:[A-Za-z']+)?\s?(?:[A-Za-z']+)?\s?)\s+(?:lbw)?(?:not\sout)?(?:run\sout)?\s?(?:\(((?:[A-Za-z']+)?\s?(?:['A-Za-z]+)?)\))?(?:(?:st\s)?\s?(?:((?:['A-Za-z]+)\s(?:['A-Za-z]+)?)))?(?:c(?:\.)?\s((?:(?:['A-Za-z]+)?\s(?:[A-Za-z']+)?)?(?:&)?))?\s+(?:b\.)?\s+((?:[A-Za-z']+)\s(?:[A-Za-z']+)?)?\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)

击球手姓名 - 第 1 组
影响绊倒的人(如果有)- 第 2 组
影响跳动的人(如果有)- 第 3 组
catch 者(如果有)- 第 4 组
采取三柱门的人(如果有)- 第 5 组
得分 - 第 6 组
球面 - 第 7 组
四人击球 - 第 8 组
六打命中 - 第 9 组

这是我需要提取的文本示例...

第 0 组包含 David Warner lbw b。哈桑 19 16 4 0 118.8%

第 1 组包含“David Warner”
本示例中不存在组 2
本示例中不存在组 3
本示例中不存在组 4
第 5 组包含“Hassan”
第 6 组包含“19”
第 7 组包含“16”
第 8 组包含“4”
第 9 组包含“0”

当我在Regexr上尝试这个时或Regex101 ,它将第 1 组指定为第 1 组中的 David Warner...但在我的 Java 程序中,它将其指定为 David。所有结果都是一样的。不知道为什么?

这是我的程序的代码:

Matcher bat = Pattern.compile("((?:\\/)?(?:[A-Za-z']+)?\\s?(?:[A-Za-z']+)?\\s?(?:[A-Za-z']+)?\\s?)\\s+(?:lbw)?(?:not\\sout)?(?:run\\sout)?\\s?(?:\\(((?:[A-Za-z']+)?\\s?(?:['A-Za-z]+)?)\\))?(?:(?:st\\s)?\\s?(?:((?:['A-Za-z]+)\\s(?:['A-Za-z]+)?)))?(?:c(?:\\.)?\\s((?:(?:['A-Za-z]+)?\\s(?:[A-Za-z']+)?)?(?:&)?))?\\s+(?:b\\.)?\\s+((?:[A-Za-z']+)\\s(?:[A-Za-z']+)?)?\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)").matcher(batting.group(1));        
while (bat.find()) {
    batPos++;
    Batsman a = new Batsman(bat.group(1).replace("\n", "").replace("\r", "").replace("S/R", "").replace("/R", "").trim(), batting.group(2));
    if (bat.group(0).contains("not out")) {
        a.bat(Integer.parseInt(bat.group(6)), Integer.parseInt(bat.group(7)), Integer.parseInt(bat.group(8)), Integer.parseInt(bat.group(9)), batting.group(2), false);
    } else {
        a.bat(Integer.parseInt(bat.group(6)), Integer.parseInt(bat.group(7)), Integer.parseInt(bat.group(8)), Integer.parseInt(bat.group(9)), batting.group(2), true);
    }
    if (!teams.contains(batting.group(2))) {
        teams.add(batting.group(2));
    }
    boolean f = true;
    Batsman clone = null;
    for (Batsman b1 : batted) {
        if (b1.eq(a)) {
            clone = b1;
            f = false;
            break;
        }
    }
    if (!f) {
        if (bat.group(0).contains("not out")) {
            clone.batUpdate(a.getRunScored(), a.getBallFaced(), a.getFour(), a.getSix(), false, true);

        } else {
            clone.batUpdate(a.getRunScored(), a.getBallFaced(), a.getFour(), a.getSix(), true, true);
        }
    } else {
        batted.add(a);
    }
}

最佳答案

您的正则表达式对于如此简单的任务来说太复杂了。为了使其简单(或就此消除它),请在单行而不是一堆文本上进行操作。

为此,请执行

String array[] = str.split("\\n");

然后,一旦你得到每一行,只需用多个空格分隔,就像

String parts[] = array[1].split("\\s\\s+");

然后您可以单独访问每个部分,例如可以访问Status

System.out.println("Status - " + parts[1]);

关于java - REGEX 未按预期在 JAVA 程序中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46047333/

相关文章:

用于基因组拼图的 Java 正则表达式

javascript - 使用imacros eval通过正则表达式提取值

javascript - 用于将小数字段验证为小时和分钟格式的正则表达式

java - 当内部 json 对象有条件为空时,使用 Jackson 将 JSON 对象映射到 Java

带有 Google 地球的 Java 应用程序

java - 使用 MouseAdapter 在 Java 中进行 Tic Tac Toe 游戏

java - 高效的图联合测试?

java - 如何更改父类(super class)中的变量

regex - 如何使用正则表达式删除名称为 YEAR-MONTH-DAY 的文件

javascript - 正则表达式精确匹配字符串