java - 此 RegEx 捕获了错误数量的组

标签 java android regex

我必须解析一个字符串并捕获一些值:

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/

相关文章:

android - 当视频在屏幕上达到一定百分比时,在 recyclerView 中暂停视频

java - 无法在 IntelliJ 的 SDK 中添加 jdk11 和 jdk13 - java

java - 多个 MDB 监听器在同一队列上读取

java - 如何从 Android 按钮单击运行单独的应用程序

regex - 在 Mvc 4 Razor View 的 cshttml 页面中使用正则表达式进行 jquery 电子邮件验证

regex - 使用package`regexp`在Golang中查找所有mactch子串,但得到意想不到的结果

javascript - 正则表达式在 JavaScript 中经过测试和工作,但在 Google Sheets REGEXEXTRACT 中中断

java - 在 block 内定义的内部类(如 Java 中的方法)不能有任何修饰符,甚至不能有 public 修饰符。为什么?

Java计算器 - 调车场

java - Android 模拟器没有反射(reflect)我在 .xml 布局文件中所做的更改