一起添加正则表达式匹配
Add regex matches together
我想创建一个正则表达式来匹配以下字符串中的所有元素:
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.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));
}
}
}
输出:
group 1: 11 jan
group 2: 22:20
group 3: Dam
group 4: Ik zal d'r zijn
来自 API 的注释:
By default, case-insensitive matching assumes that only characters in
the US-ASCII charset are being matched. Unicode-aware case-insensitive
matching can be enabled by specifying the UNICODE_CASE flag in
conjunction with this flag.
您可能希望在月份名称之后捕获句点,在这种情况下,您需要移动右圆括号。您可能还希望在名称中包含非字母字符,如果是这样,请更新 ([a-z]+)
字符 class。
链接:Regex101, RegexPlanet Java(您必须手动检查 CASE_INSENSITIVE 标志,然后才能看到 link,不知道为什么他们不在共享中保留这些 link).
这是正则表达式字符串
([\w\s]+)([\s\.]*)([\d:]+)([\s\-]*)([\w]+)([\s:]*)([\s\S]*)
更新正则表达式
([\w\s]+)(?:[\s\.]*)([\d:]+)(?:[\s\-]*)([\w]+)(?:[\s:]*)([\s\S]*)
检查此 link 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));
}
}
检查此 link:https://regex101.com/r/cP8cU9/1 了解如何获取指定组。 (查看右侧边栏)
结果:
Date: 11 jan
Message: Ik zal d'r zijn
Time: 22:20
Name: Dam
我想创建一个正则表达式来匹配以下字符串中的所有元素:
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.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));
}
}
}
输出:
group 1: 11 jan
group 2: 22:20
group 3: Dam
group 4: Ik zal d'r zijn
来自 API 的注释:
By default, case-insensitive matching assumes that only characters in the US-ASCII charset are being matched. Unicode-aware case-insensitive matching can be enabled by specifying the UNICODE_CASE flag in conjunction with this flag.
您可能希望在月份名称之后捕获句点,在这种情况下,您需要移动右圆括号。您可能还希望在名称中包含非字母字符,如果是这样,请更新 ([a-z]+)
字符 class。
链接:Regex101, RegexPlanet Java(您必须手动检查 CASE_INSENSITIVE 标志,然后才能看到 link,不知道为什么他们不在共享中保留这些 link).
这是正则表达式字符串
([\w\s]+)([\s\.]*)([\d:]+)([\s\-]*)([\w]+)([\s:]*)([\s\S]*)
更新正则表达式
([\w\s]+)(?:[\s\.]*)([\d:]+)(?:[\s\-]*)([\w]+)(?:[\s:]*)([\s\S]*)
检查此 link 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));
}
}
检查此 link:https://regex101.com/r/cP8cU9/1 了解如何获取指定组。 (查看右侧边栏)
结果:
Date: 11 jan
Message: Ik zal d'r zijn
Time: 22:20
Name: Dam