a-6ren">
gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:31:12 24 4
gpt4 key购买 nike

我需要在任何 "字符处拆分 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com