解析足球队和结果

时间:2018-08-17 09:34:49

标签: java regex

我正在尝试解析一个字符串以检索主队和客队,以及其结果。

因此字符串可以是这样的:

Football: Real Madrid 2-1 FC Barcelona
Football: Atletico de Madrid 4-2 Real Madrid

比方说,您拥有主队名称,再加上{homeTeamGoals}-{awayTeamGoals}中的结果,再加上客队名称

我想使用regexp解析字符串并检索团队名称和结果。我想到了这样的东西:

String PATTERN_SPORT = "([a-zA-Z]+ ?[0-9]?)"
String PATTERN_NAME = "(.*)"
String PATTERN_RESULT = "([0-9]*)-([0-9]*)"
String PATTERN_SPORT_AND_HOME_TEAM_RESULT_AWAY_TEAM = Pattern.compile("^" + PATTERN_SPORT + ": " + PATTERN_NAME + " " + PATTERN_RESULT + " ?"
    + PATTERN_NAME + "?$")

但是它不匹配,而且我不知道为什么,因为我使用了模式名称(。*),有什么线索吗?

3 个答案:

答案 0 :(得分:2)

我将使用以下正则表达式:(\w*:)\s?(.*)\s?(\d{1,2}-\d{1,2})\s?(.*) see here

  • 第1组(\w*:)将与这项运动相匹配,并且:(最终,您可以对此进行改进以仅参加这项运动而无需:->只需(\w*):
  • 第2组(.*)的第一个球队名称
  • 第3组(\d{1,2}-\d{1,2}),它将获得任何分数(0-0至99-99)
  • 第4组(.*)第二个小组名称

只需忽略\s。 这仅适用于您的格式(如果您使用其他格式,则可以调整正则表达式)

Java:

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

class Test {
    public static void main(String [] args){
        String s = "Football: Hannover 96 3-3 1.FC Nuernberg";
        String PATTERN_SPORT = "(\\w*:)";
        String PATTERN_NAME = "(.*)";
        String PATTERN_RESULT = "(\\d{1,2}-\\d{1,2})";
        Pattern PATTERN_RESULTS= Pattern.compile("^" + PATTERN_SPORT + "\\s?" + PATTERN_NAME + "\\s?" + PATTERN_RESULT + "\\s?" + PATTERN_NAME + "$", Pattern.UNICODE_CHARACTER_CLASS);

        Matcher matcher = PATTERN_RESULTS.matcher(s);
        if (matcher.matches()){
                System.out.println(matcher.group(1)); 
                System.out.println(matcher.group(2)); 
                System.out.println(matcher.group(3)); 
                System.out.println(matcher.group(4)); 
        }
    }
}

您可以在此处粘贴code并对其进行测试。

输出:

Football:
Hannover 96 
3-3
1.FC Nuernberg

答案 1 :(得分:1)

您需要确保匹配所有Unicode空格(:之后的第一个空格是不间断空格)。用\scompile选项Pattern.UNICODE_CHARACTER_CLASS替换所有空格将解决此问题:

String PATTERN_SPORT = "([a-zA-Z]+\\s?[0-9]?)";
String PATTERN_NAME = "(.*)";
String PATTERN_RESULT = "([0-9]*)-([0-9]*)";
Pattern PATTERN_SPORT_AND_HOME_TEAM_RESULT_AWAY_TEAM = Pattern.compile("^" + PATTERN_SPORT + ":\\s" + PATTERN_NAME + "\\s" + PATTERN_RESULT + "\\s?"
    + PATTERN_NAME + "$", Pattern.UNICODE_CHARACTER_CLASS);

Java demo

String s = "Football: Real Madrid 2-1 FC Barcelona";
String PATTERN_SPORT = "([a-zA-Z]+\\s?[0-9]?)";
String PATTERN_NAME = "(.*)";
String PATTERN_RESULT = "([0-9]*)-([0-9]*)";
Pattern PATTERN_SPORT_AND_HOME_TEAM_RESULT_AWAY_TEAM = Pattern.compile("^" + PATTERN_SPORT + ":\\s" + PATTERN_NAME + "\\s" + PATTERN_RESULT + "\\s?" + PATTERN_NAME + "$", Pattern.UNICODE_CHARACTER_CLASS);

Matcher matcher = PATTERN_SPORT_AND_HOME_TEAM_RESULT_AWAY_TEAM.matcher(s);
if (matcher.matches()){
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
    System.out.println(matcher.group(3)); 
    System.out.println(matcher.group(4)); 
    System.out.println(matcher.group(5)); 
} 

输出:

Football
Real Madrid
2
1
FC Barcelona

答案 2 :(得分:0)

您可以尝试以下模式:(?<=: )(?P<home_team>[\w ]+) (?P<result>\d{1,2}-\d{1,2}) (?P<away_team>[\w ]+)

您可能要使用不同的幕后花线:(?<=Football: )仅解析足球比赛结果。

我还假设,一支球队得分不会超过100个进球:) \d{1,2}会匹配0-99范围内的得分。

Demo