REGEX在预期的JAVA计划中不起作用

时间:2017-09-05 05:05:55

标签: 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组 影响RunOut的人(如果有的话) - 第3组 采取捕获的人(如果有的话) - 第4组 乘坐检票口的人(如果有的话) - 第5组 运行得分 - 第6组 球面临 - 第7组 Fours Hit - 第8组 Sixes Hit - 第9组

以下是我需要提取的文字示例......

第0组包含David Warner lbw b. Hassan 19 16 4 0 118.8%

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

当我在RegexrRegex101上尝试此操作时,它会将第1组视为第1组中的David Warner ...但是在我的Java程序中,它将其作为{{{ 1}}。所有结果都是一样的。我不知道为什么?

这是我的程序代码:

David

2 个答案:

答案 0 :(得分:2)

你的正则表达式对于这么简单的任务来说太复杂了。为简单起见(或消除它),请在一行而不是一堆文本上操作。

为此,请执行

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

然后,一旦你得到每一行,只需用多个空格分开,比如

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

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

一样访问
System.out.println("Status - " + parts[1]);

答案 1 :(得分:1)

所有评论员都是对的,当然,这可能不是用正则表达式解决的典型问题。但要回答你的问题 - 为什么java和regex101之间有区别? - 让我们试着解决你的正则表达式导致的一些问题,这些问题太复杂了。下一步是追踪是否以及为什么在java中使用它有所不同。

我试图理解你的正则表达式(和板球同时进行!)并提出了一个建议,可以帮助你让我们了解你的正则表达式should的样子。

首次尝试读取,直到达到数字列。我的猜测是,你应该考虑交替,而不是引入很多组。看看这个:example 1

说明:

(                                            # group 1 start
  \/?                                        # not sure why there should be /?
  [A-Z][a-z]+                                # first name
  (?:\s(?:[A-Z]['a-z]+)+)                    # last name
)

(?:\                                         # spaces
(                                            # group 2 start
  lbw                                        #   lbw or
 |not\sout                                   #   not out or
 |(c\.|st|run\sout)                          #   group 3: c., st or run out
  \s                                         #   space
  \(?                                        #   optional (
  (\w+)                                      #   group 4: name
  \)?                                        #   optional )
))?                                          # group 2 end

(?:\s+                                       # spaces

(                                            # group 5 start
  (?:b\.\s)(\w+)                             # b. name
))?                                          # group 5 end

\s+                                          # spaces
编辑1:实际上,有一个'难倒的'你的正则表达式中也缺少选项。我的补充说。 编辑2:难倒没有点。 编辑3:完整的例子可以在example 2

找到

一些用于测试它的java代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Foo {
    public static void main(String[] args) {
        String[] examples = {
                "David Warner lbw b. Hassan 19 16 4 0 118.8%",
                "Joe Burns b. Morkel 73 149 16 0 49.0%",
                "Asad Shafiq c. Rahane b. Morkel 22 38 5 0 57.9%",
                "Yasir Shah not out 1 12 0 0 8.3%",
                "Yasir Shah st Rahane 1 12 0 0 8.3%",
                "Morne Morkel run out (Shah) 11 17 1 1 64.7%"
        };

        Pattern pattern = Pattern.compile("(\\/?[A-Z][a-z]+(?:\\s(?:[A-Z]['a-z]+)+))(?:\\s+(lbw|not\\sout|(c\\.|st|run\\sout)\\s\\(?(\\w+)\\)?))?(?:\\s+((?:b\\.\\s)(\\w+)))?\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+\\.\\d%)");
        for (String text : examples) {
            System.out.println("TEXT: " + text);
            Matcher matcher = pattern.matcher(text);
            if (matcher.matches()) {
                System.out.println("batsman: " + matcher.group(1));
                if (matcher.group(2) != null) System.out.println(matcher.group(2));
                if (matcher.group(5) != null && matcher.group(5).matches("^b.*"))
                    System.out.println("bowler: " + matcher.group(6));
                StringBuilder sb = new StringBuilder("numbers are: ");
                int[] groups = {7, 8, 9, 10, 11};
                for (int i : groups) {
                    sb.append(" " + matcher.group(i));
                }
                System.out.println(sb.toString());
                System.out.println();
            }
        }
    }
}