如果您String
在不存在的分隔符上拆分 a ,那么您将取回原来的String
:
public static void main(String[] args) throws SQLException {
System.out.println(Arrays.toString("My string without pipes".split("\\|")));
}
输出:
[My string without pipes]
如果您尝试拆分字符串以您结尾的字符,则不会String
在以下内容中得到空Array
:
public static void main(String[] args) throws SQLException {
System.out.println(Arrays.toString("My string ending in pipe|".split("\\|")));
}
输出:
[My string ending in pipe]
所发生的只是最后的分隔符被删除。
所以你的逻辑是错误的。您在第二次检查中得到正确答案的原因不是因为检查正确,而是因为管道恰好在最后。
通常,您不会在String
using中获得分隔符的数量,除非您以分隔符开头或结尾,否则您spilt
将获得该数字- 在这种情况下,它将被简单地删除。+1
String
您需要做的是使用正则表达式搜索所有前面没有右括号的管道。您可以通过消极的后视来做到这一点:
public static void main(String[] args) throws SQLException {
final String s1 = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|";
final String s2 = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#, | ,A, , , , , , , , , , , , , , |";
final Pattern pattern = Pattern.compile("(?<!\\))\\|");
int count = 0;
final Matcher matcher = pattern.matcher(s1);
while (matcher.find()) {
++count;
}
System.out.println(count);
count = 0;
matcher.reset(s2);
while (matcher.find()) {
++count;
}
System.out.println(count);
}
输出:
0
2