我必须解析一个字符串并捕获一些值:
FREQ=WEEKLY;WKST=MO;BYDAY=2TU,2WE
我想捕获 2 个组:
grp 1: 2, 2
grp 2: TU, WE
数字代表间隔。 TU、WE代表工作日。两者我都需要。
我正在使用这段代码:
private final static java.util.regex.Pattern regBYDAY = java.util.regex.Pattern.compile(".*;BYDAY=(?:([+-]?[0-9]*)([A-Z]{2}),?)*.*");
String rrule = "FREQ=WEEKLY;WKST=MO;BYDAY=2TU,2WE";
java.util.regex.Matcher result = regBYDAY.matcher(rrule);
if (result.matches())
{
int grpCount = result.groupCount();
for (int i = 1; i < grpCount; i++)
{
String g = result.group(i);
...
}
}
grpCount == 2 - 为什么?如果我正确阅读了 java 文档(那一点点)我应该得到 5? 0 = 整个表达式,1,2,3,4 = 我捕获 2,2,TU 和 WE。
result.group(1) == "2";
我是一名 C# 程序员,几乎没有 java 经验,所以我在“正则表达式工作台”中测试了 RegEx - 一个用于测试 RegEx 的出色 C# 程序。我的 RegEx 工作正常。
https://code.msdn.microsoft.com/RegexWorkbench
正则表达式:
.*;BYDAY=(?:([+-]?[0-9]*)([A-Z]{2}),?)*.*
Matching:
FREQ=WEEKLY;WKST=MO;BYDAY=22TU,-2WE,+223FR
1 => 22
1 => -2
1 => +223
2 => TU
2 => WE
2 => FR
最佳答案
您还可以使用这种方法来提高可读性,并在一定程度上独立于使用更常见的正则表达式子集的实现
final Pattern re1 = Pattern.compile(".*;BYDAY=(.*)");
final Pattern re2 = Pattern.compile("(?:([+-]?[0-9]*)([A-Z]{2}),?)");
final Matcher matcher1 = re1.matcher(rrule);
if ( matcher1.matches() ) {
final String group1 = matcher1.group(1);
Matcher matcher2 = re2.matcher(group1);
while(matcher2.find()) {
System.out.println("group: " + matcher2.group(1) + " " +
matcher2.group(2));
}
}
关于java - 此 RegEx 捕获了错误数量的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2290596/