Я делал вопрос из книги oracle_certified_professional_java_se_7_programmer_exams_1z0-804_and_1z0-805 Ганеша и Шармы.
Один вопрос:
Рассмотрим следующую программу и предскажите результат:
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); } }
a) 0
b) 5
c) 12
d) 16
Теперь я понимаю, что \S - средство регулярных выражений, которое обрабатывает непространственные символы как разделители. Но я был озадачен тем, как выражение регулярного выражения выполняет его соответствие, и каковы фактические жетоны, произведенные расколом.
Я добавил код для распечатки токенов следующим образом
for (String str: tokens){
System.out.println("<" + str + ">");
}
и я получил следующий вывод
16
<>
< >
<>
< >
<>
<>
<>
<>
<>
<>
<>
<>
< >
<>
<>
< >
Так много пустых токенов. Я просто не понимаю этого.
Я бы подумал по строкам, что если разделители не являются пробелами, то в приведенном выше тексте все алфавитные символы служат разделителями, поэтому, возможно, должно быть 21 токен, если мы сопоставим которые также приводят к пустым строкам. Я просто не понимаю, как работает Java regex engine. Есть ли какие-либо гуру регулярных выражений, которые могут пролить свет на этот код для меня?