【问题标题】:RegEx to split a String either at "," or L," or ",N [duplicate]正则表达式在“,”或“L”或“,N”处拆分字符串
【发布时间】:2025-12-05 18:05:02
【问题描述】:

我是学习 RegEx 的绝对初学者。我需要根据多个条件将字符串拆分为不同的子字符串。

字符串:

"abc","def",NULL,"ghi",NULL,"jkl"

应该拆分为

[abc, def, NULL, ghi, NULL, jkl]

目前我正在使用String[] split = line.split("\",\""); 生成所有包含在 "..." 中并由 , 分隔的子字符串。这可以正常工作,但如果有一个 NULL 值(不包含在“...”中),则子字符串的拆分不正确。

如果满足以下条件之一,是否可以通过使用拆分字符串的正则表达式将字符串拆分为子字符串?

  • ","
  • L,"
  • ",N

提前致谢!

【问题讨论】:

  • 好像你需要一个 CSV 解析器,而不是正则表达式
  • 你能显示实际的字符串值....正确转义字符吗?
  • 你的字符串值是否包含逗号或者你为什么不使用split(",")
  • 注意:不是拆分,而是捕获所有值用引号括起来,或者逗号之后或之前的所有NULL

标签: java arrays regex string split


【解决方案1】:

我们可以先用空字符串替换所有双引号,然后我们可以用分隔符逗号分割结果字符串。如下图

String[] strArray = str.replaceAll("\"" , "").split(",");

 String str = "\"abc\",\"def\",NULL,\"ghi\",NULL,\"jkl\"";
 String[] strArray = str.replaceAll("\"" , "").split(",");
 Arrays.asList(strArray).stream().forEach(System.out::println);

【讨论】:

    【解决方案2】:
        String input = "\"abc\",\"def\",NULL,NULL,\"ghi\",NULL,\"jkl\"";
        String [] split = input.split("(\",\")|(\",)|(,\")|(L,)");
        for (int i = 0; i < split.length; i++) {
            if (split[i].startsWith("\"")) {
                split[i] = split[i].substring(1);
            }
            if (split[i].endsWith("\"")) {
                split[i] = split[i].substring(0, split[i].length() -1);
            }
            if (split[i].equals("NUL")) {
                split[i] = "NULL";
            }
        }
    

    输出

    [abc, def, NULL, NULL, ghi, NULL, jkl]
    

    【讨论】:

    • 这会弄乱包含逗号的字符串值。这可能是 OP 不只使用 split(",") 的原因。
    • 已更新以处理有效字符串中的逗号。
    • 现在它不处理类似NULL,NULL
    • 我认为这是正则表达式的限制。我能想到的唯一另一件事是为 (L,) 添加一个案例,然后将所有 NUL 替换为 NULL。
    【解决方案3】:

    我认为你不需要正则表达式。您的问题可以通过split()replace() 方法解决。

    public static void main(String[] args) {
        String str = "\"abc\",\"def\",NULL,\"ghi\",NULL,\"jkl\"";
        List<String> list = Arrays.stream(str.split(","))
                .map(part -> part.replace("\"", ""))
                .collect(Collectors.toList());
        System.out.println(list);
    }
    

    输出:

    [abc, def, NULL, ghi, NULL, jkl]

    【讨论】:

    • 这会弄乱包含逗号的字符串值。这可能是 OP 不只使用split(",") 的原因。
    • split 的参数总是一个正则表达式,顺便说一句