正则表达式未捕获预期组中的匹配项
Regex not capturing matching in expected groups
我一直在处理需求,我需要在以下字符串上创建一个正则表达式:
startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]
此字符串可以有多种变体,如下所示:
startDate:[*;2016-10-12T12:23:23Z]
startDate:[2016-10-12T12:23:23Z;*]
startDate:[*;*]
上面表达式中的 startDate
是一个键名,可以是 endDate、updateDate 等任何东西,这意味着我们不能在表达式中对其进行硬编码。尽管 [a-zA-Z_0-9]*
键名可以接受为任何单词
我正在使用以下编译模式
Pattern.compile("([[a-zA-Z_0-9]*):(\[[[\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]];[[\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]]\]])");
模式匹配,但创建的组不是我所期望的。我想要下面括号中的组:
(startDate):([*:2016-10-12T12:23:23Z])
group1 = "startDate"
group2 = "[*;2016-10-12T12:23:23Z]"
你能帮我在Java和群组中正确表达吗?
您正在使用 [
而不是 (
来包装选项(即使用 |
)。
例如,以下代码适用于我:
Pattern pattern = Pattern.compile("(\w+):(\[(\*|\d{4}):\*\])");
Matcher matcher = pattern.matcher(text);
if (matcher.matches()) {
for (int i = 0; i < matcher.groupCount() + 1; i++) {
System.out.println(i + ":" + matcher.group(i));
}
} else {
System.out.println("no match");
}
为了简化操作,我只使用了年份,但我确信它可以使用完整的时间戳字符串。
此表达式在组中捕获的内容超出了您的需要,但您可以使用 (?: )
结构使它们 'non-capturing'。
请注意,我使用预定义字符 类 简化了一些正则表达式。有关详细信息,请参阅 http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html。
这是一个使用原始正则表达式的解决方案,经过修改后它实际上 returns 您想要的组:
String content = "startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]";
Pattern pattern = Pattern.compile("([a-zA-Z_0-9]*):(\[(?:\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z|\*):(?:\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z|\*)\])");
Matcher matcher = pattern.matcher(content);
// remember to call find() at least once before trying to access groups
matcher.find();
System.out.println("group1 = " + matcher.group(1));
System.out.println("group2 = " + matcher.group(2));
输出:
group1 = startDate
group2 = [2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]
此代码已经在 IntelliJ 上进行了测试,似乎可以正常工作。
我一直在处理需求,我需要在以下字符串上创建一个正则表达式:
startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]
此字符串可以有多种变体,如下所示:
startDate:[*;2016-10-12T12:23:23Z]
startDate:[2016-10-12T12:23:23Z;*]
startDate:[*;*]
上面表达式中的 startDate
是一个键名,可以是 endDate、updateDate 等任何东西,这意味着我们不能在表达式中对其进行硬编码。尽管 [a-zA-Z_0-9]*
我正在使用以下编译模式
Pattern.compile("([[a-zA-Z_0-9]*):(\[[[\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]];[[\*]|[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[Z]]\]])");
模式匹配,但创建的组不是我所期望的。我想要下面括号中的组:
(startDate):([*:2016-10-12T12:23:23Z])
group1 = "startDate"
group2 = "[*;2016-10-12T12:23:23Z]"
你能帮我在Java和群组中正确表达吗?
您正在使用 [
而不是 (
来包装选项(即使用 |
)。
例如,以下代码适用于我:
Pattern pattern = Pattern.compile("(\w+):(\[(\*|\d{4}):\*\])");
Matcher matcher = pattern.matcher(text);
if (matcher.matches()) {
for (int i = 0; i < matcher.groupCount() + 1; i++) {
System.out.println(i + ":" + matcher.group(i));
}
} else {
System.out.println("no match");
}
为了简化操作,我只使用了年份,但我确信它可以使用完整的时间戳字符串。
此表达式在组中捕获的内容超出了您的需要,但您可以使用 (?: )
结构使它们 'non-capturing'。
请注意,我使用预定义字符 类 简化了一些正则表达式。有关详细信息,请参阅 http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html。
这是一个使用原始正则表达式的解决方案,经过修改后它实际上 returns 您想要的组:
String content = "startDate:[2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]";
Pattern pattern = Pattern.compile("([a-zA-Z_0-9]*):(\[(?:\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z|\*):(?:\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z|\*)\])");
Matcher matcher = pattern.matcher(content);
// remember to call find() at least once before trying to access groups
matcher.find();
System.out.println("group1 = " + matcher.group(1));
System.out.println("group2 = " + matcher.group(2));
输出:
group1 = startDate
group2 = [2016-10-12T12:23:23Z:2016-10-12T12:23:23Z]
此代码已经在 IntelliJ 上进行了测试,似乎可以正常工作。