0

我必须分 3 个阶段解析字符串。只有第一阶段有效,在 2 和 3 阶段 matcher.groupCount() 返回 0 - 这意味着它什么也没找到。我正在在线测试仪中测试我的正则表达式,这很好。但在这里它不起作用。所以问题是我可能错过了什么或者正则表达式有错误?

String rawText = "ashjdajsdg:[requiredPartForFirstPattern]}asdassdasd";
Pattern firstPattern = Pattern.compile("(:\\[)(.*?)(\\]})");
List<String> firstList = parseContent(rawText, firstPattern);

执行后 firstList 应该只包含一个值(在这种情况下):“requiredPartForFirstPattern”(可以是任何字符或任何字符序列)。

现在我正在迭代 firstList 中的所有值并使用 2 模式检查它们:

firstList 中的所有值都将具有以下形式:“[someText1],[someText2],[someText3]”。

String rawText = "[someText1],[someText2],[someText3]"; 
Pattern secondPattern = Pattern.compile("(\\[([^]]*)\\])");
List<String> secondList = parseContent(rawText, secondPattern);

执行后 secondList 应该包含以下值(在这种情况下):“someText1”、“someText2”、“someText3”。

最后是第三阶段。我迭代 secondList 中的所有值并用 3 模式检查它们。secondList 中的所有值都将具有以下形式:“'someValue1','someValue2'”。

String rawText = "'someValue1','someValue2'";
Pattern thirdPattern = Pattern.compile("('(.*?)')");
List<String> thirdList = parseContent(rawText, secondPattern);

执行后 secondList 应该包含这个值(在这种情况下):“someValue1”,“someValue2”。

我的 parseContent 方法:

    private List<String> parseContent(String content, Pattern pattern) {
        List<String> matchedList = new LinkedList<>();

        Matcher matcher = pattern.matcher(content);
        if (matcher.find()) {
            for(int matchIndex = 0; matchIndex < matcher.groupCount(); ++matchIndex) {
                matchedList.add(matcher.group(matchIndex));
            }
        }
        return matchedList;
    }
4

1 回答 1

0

您应该使用 while (matcher.find()) 而不是 if 语句。

if (matcher.find()) {
    for(int matchIndex = 0; matchIndex < matcher.groupCount(); ++matchIndex) {
        matchedList.add(matcher.group(matchIndex));
    }
}

我已经用这个替换了上面的代码:

while (matcher.find()) {
    matchedList.add(matcher.group(1));
}

工作正常,求帮助。

于 2015-04-24T13:45:35.993 回答