一起添加正则表达式匹配

时间:2015-01-14 23:09:07

标签: java regex

我想创建一个正则表达式来匹配以下字符串中的所有元素:

11 jan. 22:20 - Dam: Ik zal d'r zijn

我希望匹配日期,时间,名称(Dam)和消息。

目前,我有以下正则表达式:

checks date: [1-31 a-z]
checks message: ([^:]+)(.*)$
checks time: (([0-1]?[0-9]|2[0-3]):[0-5][0-9])
checks name: (?:\s[^:-]+)

如何将这些粘在一起?我想这样使用它:

String date = matcher.group(1);
Time time = new Time(matcher.group(2));
String name = matcher.group(3);
Message message = new Message(matcher.group(4));
Chat chat = new Chat(date,time,name,message);

此外,该名称不仅与 - \ s之后的值匹配,还与消息和部分时间匹配。

2 个答案:

答案 0 :(得分:2)

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

public class HelloWorld {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("(\\d{1,2}\\s[a-z]{3})\\.?\\s(\\d{1,2}:\\d{1,2})\\s-\\s([a-z]+):\\s(.+)", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher("11 jan. 22:20 - Dam: Ik zal d'r zijn");

    while (m.find())
    {
      for (int i=1; i <= m.groupCount(); ++i)
        System.out.println("group " + i + ": " + m.group(i));
    }
  }
}

输出:

  第1组:11月1日   第2组:22:20
  第3组:大坝
  第4组:Ik zal d'r zijn

来自API

的注释
  

默认情况下,不区分大小写的匹配假定只包含字符   US-ASCII字符集正在匹配。 Unicode感知不区分大小写   可以通过在中指定UNICODE_CASE标志来启用匹配   与这面旗帜结合。

您可能希望捕获月份名称后的句点,在这种情况下,您将移动结束圆括号。您可能还希望在名称中包含非字母字符,如果是,请更新([a-z]+)字符类。

链接:Regex101RegexPlanet Java(您必须在关注该链接时手动检查CASE_INSENSITIVE标志,不确定他们为什么不保留共享链接中的那些)。

答案 1 :(得分:0)

这是正则表达式字符串

([\\w\\s]+)([\\s\\.]*)([\\d:]+)([\\s\\-]*)([\\w]+)([\\s:]*)([\\s\\S]*)

更新正则表达式

([\w\s]+)(?:[\s\.]*)([\d:]+)(?:[\s\-]*)([\w]+)(?:[\s:]*)([\s\S]*)

检查此链接https://regex101.com/r/cP8cU9/2

测试:

Pattern pattern = Pattern
        .compile("([\\w\\s]+)(?:[\\s\\.]*)([\\d:]+)(?:[\\s\\-]*)([\\w]+)(?:[\\s:]*)([\\s\\S]*)");
Matcher matcher = pattern
        .matcher("11 jan. 22:20 - Dam: Ik zal d'r zijn");
while (matcher.find()) {
    System.out.println(String.format("Date: %s", matcher.group(1)));
    System.out.println(String.format("Time: %s", matcher.group(2)));
    System.out.println(String.format("Name: %s", matcher.group(3)));
    System.out.println(String.format("Message: %s", matcher.group(4)));
}

或者你可以循环获取数据

while (matcher.find()) {
    int groupCnt = matcher.groupCount();
    for (int i = 1; i <= groupCnt; i++) {
        System.out.println(matcher.group(i));
    }
}

检查此链接:https://regex101.com/r/cP8cU9/1以了解如何获取指定组。 (请看右侧边栏)

结果:

Date: 11 jan
Message: Ik zal d'r zijn
Time: 22:20
Name: Dam