Как именно работает метод String.split() в Java, когда предоставляется регулярное выражение?

Я готовлюсь к экзамену OCPJP и натолкнулся на следующий пример:

class Test {
   public static void main(String args[]) {
      String test = "I am preparing for OCPJP";
      String[] tokens = test.split("\\S");
      System.out.println(tokens.length);
   }
}

Этот код печатает 16. Я ожидал что-то вроде no_of_characters + 1. Может кто-нибудь объяснить мне, что на самом деле делает метод split() в этом случае? Я просто не понимаю...

1 ответ

Решение

Это распадается на каждом "\\S" который в регулярном выражении двигателя представляет \S непробельный символ.

Итак, давайте попробуем разделить "x x" на не пропусках (\S). Поскольку этому регулярному выражению может соответствовать один символ, давайте итерируем по ним, чтобы отметить места разделения (мы будем использовать трубу | для этого).

  • является 'x' непробельный? ДА, так давайте отметим это | x
  • является ' ' непробельный? НЕТ, поэтому мы оставляем все как есть
  • последний 'x' непробельный? ДА, так давайте отметим это | |

Таким образом, в результате нам нужно разделить нашу строку в начале и в конце, что изначально дает нам массив результатов

["", " ", ""]
   ^    ^ - here we split

Но так как завершающие пустые строки удаляются, результат будет

[""," "]     <- result
        ,""] <- removed trailing empty string

поэтому split возвращает массив ["", " "] который содержит только два элемента.

КСТАТИ. Чтобы отключить удаление последних пустых строк, вам нужно использовать split(regex,limit) с отрицательным значением лимита, как split("\\S",-1),


Теперь вернемся к вашему примеру. В случае ваших данных вы делитесь на каждый из

I am preparing for OCPJP
| || ||||||||| ||| |||||

что значит

 ""|" "|""|" "|""|""|""|""|""|""|""|""|" "|""|""|" "|""|""|""|""|""

Так что это представляет этот массив

[""," ",""," ","","","","","","","",""," ","",""," ","","","","",""]  

но так как тянущиеся пустые строки "" удаляются (если их существование было вызвано разделением - дополнительная информация по адресу: Непонятный вывод из String.split)

[""," ",""," ","","","","","","","",""," ","",""," ","","","","",""]  
                                                     ^^ ^^ ^^ ^^ ^^

Вы получаете массив результатов, который содержит только эту часть:

[""," ",""," ","","","","","","","",""," ","",""," "]  

которые ровно 16 элементов.

Другие вопросы по тегам