Разделение строки Java дает разные результаты в Windows и Linux

См. ниже код -

String s11 ="!country=India ";    
String[] ss =s11.split("((?<=[!&|])|(?=[!&|]))");
System.out.println(ss.length);
for(String s :ss) {
  System.out.println(s);
}

В Windows он дает

2
!
country=India 

Если Ubuntu дает

3

!
country=India 

Почему это должно быть?

Ответ 1

Это поведение не из-за разных операционных систем, но, вероятно, используются разные версии JVM.

Это "изменение поведения" вызвало ошибки неправильно записанные для Java 8.

Документация была обновлена ​​для JDK 8, а также обсуждается в в этом вопросе, где split в Java 8 удаляет пустые строки в начале массива результатов. Вот почему дополнительная пустая строка перед ! не создается (следовательно, длина 2 вместо 3).

Обратите внимание на разницу в документации для метода split() в Java 7 и в Java 8 для класса Pattern и класс строки (Java 7, Java 8) соответственно. См. Исходный вопрос, связанный для получения дополнительной информации об этом.

Я также воспроизвел эту проблему на Java 7: sun-jdk-1.7.0_10 (ideone) и Java 8 sun- jdk-8u25 (ideone). См. здесь версии Java. Java 8 split предоставит возможность не добавлять лишнюю пустую строку в массив, тогда как разделение Java 7 будет.

Это не из-за того, что система является Linux или Windows, а скорее версией JVM. Вы можете дважды проверить версию JVM с помощью java -version