我一直致力于使用正则表达式的程序。它搜索文件中的一些文本,根据不同玩家的得分给我一个数据库。
以下是搜索文本的示例。
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
当我在Regexr或Regex101上尝试此操作时,它会将第1组视为第1组中的David Warner
...但是在我的Java程序中,它将其作为{{{ 1}}。所有结果都是一样的。我不知道为什么?
这是我的程序代码:
David
答案 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();
}
}
}
}