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