我一直在开发一个使用正则表达式的程序。它会搜索文件中的一些文本,为我提供一个基于不同玩家得分的数据库。
以下是其搜索的文本示例。
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/