我正在尝试解析一个字符串以检索主队和客队,以及其结果。
因此字符串可以是这样的:
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 + "?$")
但是它不匹配,而且我不知道为什么,因为我使用了模式名称(。*),有什么线索吗?
答案 0 :(得分:2)
我将使用以下正则表达式:(\w*:)\s?(.*)\s?(\d{1,2}-\d{1,2})\s?(.*)
see here
(\w*:)
将与这项运动相匹配,并且:(最终,您可以对此进行改进以仅参加这项运动而无需:
->只需(\w*):
)(.*)
的第一个球队名称(\d{1,2}-\d{1,2})
,它将获得任何分数(0-0至99-99)(.*)
第二个小组名称只需忽略\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空格(:
之后的第一个空格是不间断空格)。用\s
和compile
选项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);
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范围内的得分。