我正试图解析一个字符串来检索主队和客队,以及它的结果。
所以字符串可以是这样的:
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 + "?$")但是它不匹配,我不知道为什么,因为我使用了模式名称(.*),有任何线索吗?
发布于 2018-08-17 09:44:54
您需要确保您匹配所有Unicode空白空间( :之后的第一个空白空间是一个不间断的空间)。用\s替换所有空格,用Pattern.UNICODE_CHARACTER_CLASS选项替换compileing将解决这个问题:
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发布于 2018-08-17 10:10:22
我将使用以下正则表达式:(\w*:)\s?(.*)\s?(\d{1,2}-\d{1,2})\s?(.*) 请看这里
(\w*:)将与这项运动相匹配,并:(最终您可以改进这个项目,使其只参加不需要: ->的运动,只需做(\w*):)(.*)第一团队名称(\d{1,2}-\d{1,2})这将取任何分数(0-0到99-99)。(.*)第二组名称只需忽略\s。这只适用于您的格式(如果您有其他格式,可以调整regex )。
爪哇:
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));
}
}
}您可以在这里粘贴代码并测试它。
输出:
Football:
Hannover 96
3-3
1.FC Nuernberg发布于 2018-08-17 10:03:01
您可以尝试以下模式:(?<=: )(?P<home_team>[\w ]+) (?P<result>\d{1,2}-\d{1,2}) (?P<away_team>[\w ]+)。
您可能需要使用不同的football:(?<=Football: )来解析足球结果。
我还假设,一支球队的进球不会超过100个:) \d{1,2}将与0-99的比分相匹配。
https://stackoverflow.com/questions/51892465
复制相似问题