Java 将正则表达式匹配项添加到一起

Java 将正则表达式匹配项添加到一起,java,regex,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[^:-]+) 我怎么把这些粘在一起?我想这样使用它: Str

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

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之后的值匹配,还与消息和部分时间匹配。

import java.util.regex.Pattern;
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));
    }
  }
}
导入java.util.regex.Matcher; 公共类HelloWorld{ 公共静态void main(字符串[]args){ 模式p=Pattern.compile(\\d{1,2}\\s[a-z]{3})\.?\\s(\\d{1,2}:\\d{1,2})\\s-\\s([a-z]+):\\s(+)”,模式不区分大小写); Matcher m=p.Matcher(“1月11日22:20-大坝:Ik zal d'r zijn”); while(m.find()) {
对于(inti=1;i,这里是正则表达式字符串

([\\w\\s]+)([\\s\\.]*)([\\d:]+)([\\s\\-]*)([\\w]+)([\\s:]*)([\\s\\S]*)
更新正则表达式

([\w\s]+)(?:[\s\.]*)([\d:]+)(?:[\s\-]*)([\w]+)(?:[\s:]*)([\s\S]*)
查看此链接

测试:

或者你可以做一个循环来获取数据

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

你是在哪个平台上开发的?看起来很像Java 7,但想确定一下。很好!为什么是/i而不是/g?还有,我如何进行组匹配1和2?我也会遇到很多转义错误,顺便说一句,everywhere\都是使用的。我是不区分大小写的。如果你在运行日志,你还想包括g。圆括号是组匹配的边界,所以只需要使用o用第一个的结束括号和第二个的开始括号来合并它们。很好!我有点困惑,为什么在这个正则表达式编译得很好的时候,我会在非法转义字符上出错:
“^(\\d\\d?[\\/-]\\d\\d?[\/-]\\d{2,4})(\\d\\d:\\d:\\d:\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d
Regex101不使用java转义。我将很快更新完整的代码示例。将输入字符串更改为
a1 jan.22:20-Dam:Ik zal d'r zijn
,您的正则表达式将给出日期的假阳性。谢谢您的回答,Jack,但是,因为我在代码中使用了多个正则表达式,matcher.group()需要从1数到4,而不是跳转。这很容易编辑,您只需将?:添加到您不想加入的组。请参阅我的更新
while (matcher.find()) {
    int groupCnt = matcher.groupCount();
    for (int i = 1; i <= groupCnt; i++) {
        System.out.println(matcher.group(i));
    }
}
Date: 11 jan
Message: Ik zal d'r zijn
Time: 22:20
Name: Dam