Java 具有固定开始和重复块的字符串的正则表达式

Java regex for string with fixed start and repeated blocks

考虑一行文本,例如

"ab,""c"",""d"",""e"",""""

上面的行有一个固定的开始 "ab 然后它重复像

这样的块
,""<non-quote(s)>""

(即,逗号,后跟 2 个双引号,后跟 0 个或多个非引号,后跟 2 个引号),可能为空块(即 4 个连续引号 """")。

这样的正则表达式

将匹配所有块(即从第一个逗号开始的所有内容,包括在内),但忽略固定开头。

使用 "or" (|) 子句,例如

有效,但有 2 个组,其中 #1 是 matcher.find() 第一轮的固定开始,其余的 null,而 #2 是 null在第一次调用中并在所有其他调用中正确填充。

是否有一个有效的 Java 正则表达式可以生成单个组,对于 matcher.find() returns 的连续调用,首先是固定的开始,然后是每个重复块?

我认为这就是您正在寻找的模式:

"{1,2}([^",]*)(?:"")?(?:,|$)

或作为 Java 字符串:

\"{1,2}([^\",]*)(?:\"\")?(?:,|$)

然后您在 组 1(唯一捕获的组)中获得所需的值。

请记住,此正则表达式仅对拆分字符串有用,对验证字符串无效。此外,它不支持带有 [ , ][ " ] 的值。

这里有一个用法示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class MatcherTest {
    private static String text = "\"ab,\"\"c\"\",\"\"d\"\",\"\"e\"\",\"\"\"\"";

    private static String patternString = "\"{1,2}([^\",]*)(?:\"\")?(?:,|$)";

    public static void main(final String[] args) throws java.lang.Exception {
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            System.out.println("'" + matcher.group(1) + "'");
        }
    }
}