Документація Java не відповідає стандарту Unicode. Javadoc помилково приймає те, що \R
має відповідати. Це говорить:
\R
Будь-яка послідовність розбиття рядків Unicode еквівалентна \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
Ця документація Java є помилковою. У своєму розділі про розриви рядків R1.6 Технічний стандарт Unicode № 18 про регулярні вирази чітко зазначає:
Настійно рекомендується мати метасимвол регулярного виразу, такий як "\ R", для узгодження всіх символів, що закінчуються, і послідовностей, перелічених вище (наприклад, у №1). Це відповідало б чомусь еквівалентному наступному виразу. Цей вираз дещо ускладнюється необхідністю уникати резервного копіювання.
(?:\u{D A}|(?!\u{D A})[\u{A}-\u{D}\u{85}\u{2028}\u{2029}]
Іншими словами, він може співпадати лише з двома послідовностями CR + LF (повернення каретки + подача лінії) з кодовою точкою, або ж окрема кодова точка з цього набору за умови, що це не просто повернення каретки, за якою слідує подача лінії . Це тому, що це так резервне копіювання заборонено . CRLF повинен бути атомним,\R
щоб нормально функціонувати.
Отже, Java 9 більше не відповідає тому, що настійно рекомендує R1.6. Більше того, зараз він робить те, що НЕ повинен був робити і не робив, у Java 8.
Здається, мені пора знову дати Шерману (читай: Сюемін Шену) крик. Я вже працював із ним над цими дрібницями, що стосуються офіційної відповідності.
\R
жадібний, тоді як у 9 - ні.