为什么这个正则表达式只匹配一次?

时间:2013-05-23 09:57:17

标签: java regex

我的字符串看起来像这样:

"Mo 13:00 - 14:00, Di 15:00-19:00, Montag - Dienstag 18:00-23:00 Montag bis Samstag 03:00 bis 10:00"

我想创建这样的子串:

"Mo 13:00 - 14:00", "Di 15:00-19:00", "Montag - Dienstag 18:00-23:00"...

如果现在已经创建了这种模式:

"([a-zA-Z\\s]*\\d\\d[:]\\d\\d\\s\\S*\\s\\d\\d[:]\\d\\d)"

但是使用Matcher.find()我只得到一个结果:"Mo 13:00 - 14:00"

这是一个示例代码,以防我犯了一个愚蠢的错误:

String xy = "Mo 13:00 - 14:00, Di 15:00-19:00, Montag - Dienstag 18:00-23:00 Montag bis      Samstag 03:00 bis 10:00";
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("([a-zA-Z\\s]*\\d\\d[:]\\d\\d\\s\\S*\\s\\d\\d[:]\\d\\d)");
java.util.regex.Matcher matcher = pattern.matcher(xy);
while(matcher.find())
{
    System.out.println(matcher.group());
}

3 个答案:

答案 0 :(得分:4)

使用这样的正则表达式:

([a-zA-Z][a-zA-Z\\s-]*\\d\\d[:]\\d\\d\\s*\\S*?\\s*\\d\\d[:]\\d\\d)`
 \______/\___________/\_____________/\__/     \__/\_____________/
    |          |           ##:##       |_______|       ##:##
    |          |                           |
start with   accepts any number of       account for 
a letter     letters, spaces or "-"      optional spaces
             (Required for dates like:
              "Montag - Dienstag...")

另请参阅此 short demo

您可能还需要有关 Regular Expressions 的更多信息。

答案 1 :(得分:1)

您需要时间和破折号之间的空格:\\s\\S*\\s。只有第一次出现这样的空格。尝试将该空格设为可选:\\?\\S*\\s?

答案 2 :(得分:1)

String dates = "Mo 13:00 - 14:00, Di 15:00-19:00, Montag - Dienstag 18:00-23:00 Montag bis Samstag 03:00 bis 10:00";
        Pattern pattern = Pattern.compile("(.+?)((?<=\\d),?\\s(?=[A-Z])|$)");
        Matcher matcher = pattern.matcher(dates);
        while (matcher.find()) {
            System.out.println(matcher.group(1));
        }

输出:

Mo 13:00 - 14:00
Di 15:00-19:00
Montag - Dienstag 18:00-23:00
Montag bis Samstag 03:00 bis 10:00