java - 如何在任何 "character, but never at\"拆分字符串(在 Java 中)? RegEx 是否合适,如果合适,如何?

标签 java regex string split

我需要在任何 "字符处拆分 Java 字符串。 最主要的是,它的前一个字符可能不是反斜杠 (\)。

所以这些字符串会像这样拆分:

asdnaoe"asduwd"adfdgb         =>   asdnaoe, asduwd, adfgfb
addfgmmnp"fd asd\"das"fsfk    =>   addfgmmnp, fd asd\"das, fsfk

有没有什么简单的方法可以使用正则表达式来实现这一点? (我使用 RegEx 是因为它对我这个编码员来说最简单。而且性能也不是问题...)

提前谢谢你。

我是这样解决的:

    private static String[] split(String s) {
    char[] cs = s.toCharArray();

    int n = 1;

    for (int i = 0; i < cs.length; i++) {
        if (cs[i] == '"') {
            int sn = 0;

            for (int j = i - 1; j >= 0; j--) {
                if (cs[j] == '\\')
                    sn += 1;
                else
                    break;
            }

            if (sn % 2 == 0)
                n += 1;
        }
    }

    String[] result = new String[n];

    int lastBreakPos = 0;
    int index = 0;
    for (int i = 0; i < cs.length; i++) {
        if (cs[i] == '"') {
            int sn = 0;

            for (int j = i - 1; j >= 0; j--) {
                if (cs[j] == '\\')
                    sn += 1;
                else
                    break;
            }

            if (sn % 2 == 0) {
                char[] splitcs = new char[i - lastBreakPos];

                System.arraycopy(cs, lastBreakPos, splitcs, 0, i - lastBreakPos);
                lastBreakPos = i + 1;

                result[index] = new StringBuilder().append(splitcs).toString();
                index += 1;
            }
        }
    }

    char[] splitcs = new char[cs.length - (lastBreakPos + 1)];

    System.arraycopy(cs, lastBreakPos, splitcs, 0, cs.length - (lastBreakPos + 1));

    result[index] = new StringBuilder().append(splitcs).toString();

    return result;
}

无论如何,感谢您的所有精彩回复! (哦,尽管如此,我还是会使用@biziclop 或@Alan Moore 的版本,因为他们 '更短,可能更有效率! =)

最佳答案

当然,就用

(?<!\\)"

快速 PowerShell 测试:

PS> 'addfgmmnp"fd asd\"das"fsfk' -split '(?<!\\)"'
addfgmmnp
fd asd\"das
fsfk

但是,这不会在 \\" 上拆分(一个转义的反斜杠,后跟一个正常的引号 [至少在大多数类 C 语言的转义规则中])。你无法真正解决但是,在 Java 中,因为不支持任意长度的回顾:

PS> 'addfgmmnp"fd asd\\"das"fsfk' -split '(?<!\\)"'
addfgmmnp
fd asd\\"das
fsfk

通常您会期望一个适当的解决方案来拆分剩余的 ",因为它并没有真正转义。

关于java - 如何在任何 "character, but never at\"拆分字符串(在 Java 中)? RegEx 是否合适,如果合适,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10805029/

相关文章:

c - 如何使 strcmp() 在我的 C 程序中工作

java - IllegalArgumentException : width and height must be > 0 - error when loading an image using Imgcodecs. 已读

java - 使用 MultiMap 的优先级队列 - Java

java - 当用户访问网站时以编程方式编译java类

java - 我正在为CodeChef编写代码。但是出现错误TLE可以进一步优化吗?

regex - 如何在 Visual Studio Code 中替换文档中的每一个换行符,而不是每两个换行符(或更多)?

string - 用 iota 枚举字符串常量

regex - mysql 查询的 where 子句中的正则表达式或替换函数

regex - 在kibana 4中,我想可视化一部分URL字段以进行计数

python - 遍历字符串的行