Как именно работает Java Split ()? - PullRequest
0 голосов
/ 07 сентября 2018

почему использование split() в Java работает по-другому? Я хочу разделить строку версии следующим образом: 1.2.3.4 однако, если я сделаю так: получу пустой массив, если я использую split("\\."), он будет работать так, как я ожидал:

        String version1 = "1.2.3.4.5";
        String version2 = "1.2.3.4.5.6";
        String[] v1Arr = version1.split("."); 
        String[] v2Arr = version2.split("\\."); 
        System.out.println(Arrays.toString(v1Arr)); // [] why?
        System.out.println(Arrays.toString(v2Arr)); // [1, 2, 3, 4, 5, 6]


String version1 = "1-2-3-4-5";
String version2 = "1-2-3-4-5-6";
String[] v1Arr = version1.split("-");
String[] v2Arr = version2.split("\\-");

System.out.println(Arrays.toString(v1Arr)); // [1, 2, 3, 4, 5]
System.out.println(Arrays.toString(v2Arr)); // [1, 2, 3, 4, 5, 6]

Если я поменяю "." чтобы "-" оба работали как положено, почему это происходит? Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

\ называется escape-символом и. точка интерпретируется как escape-символ, поэтому вы не можете использовать точку напрямую для разделения строки

, поэтому вы должны использовать \ как escape-символ с точкой, чтобы представить точку в строке

0 голосов
/ 07 сентября 2018

Так же, как альтернатива ответу @Elliott Frisch, вы также можете разделить символ или символы, содержащиеся в классе символов регулярных выражений. Рассмотрим следующий фрагмент кода:

String version = "1.2.3.4.5.6";
String[] parts = version.split("[.]");

Квадратные скобки сообщают механизму регулярных выражений, что все, что находится внутри, должно рассматриваться как буквальный символ, в данном случае буквальная точка. Этот подход может быть еще более полезным при попытке разделить несколько символов, многие из которых, возможно, являются метасимволами. Используя скобочные обозначения, нам не нужно беспокоиться о специальном синтаксисе экранирования.

0 голосов
/ 07 сентября 2018

. - это специальный токен шаблона в регулярном выражении. Это соответствует любому одному символу. Когда вы разделяете каждый возможный символ, вы получаете пустой массив (потому что ничего не осталось). Напротив, когда вы экранируете . с \\., токен отображается как литерал (и соответствует только литералу .).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...