Как разделить пробелы Юникода в Котлине

В Котлине, если мы используем:

string.split(Regex("\\s+"))

Затем мы можем разбить строку на слова, разделенные пробелом. Однако строка:

val string = "a\u2000b"

не разделяется, так как регулярное выражение не соответствует символам пробела Юникода.

Есть ли способ разделить строку на все пробельные символы?

Вы можете взглянуть на icu4j (site.icu-project.org/home/why-use-icu4j), в частности: BreakIterator.getCharacterInstance()

David Soroko 21.05.2019 13:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 821
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я использовал следующее регулярное выражение для соответствия пробелам Unicode:

Regex("[\\p{javaWhitespace}\u00A0\u2007\u202F]+")

Это работает, потому что, хотя \s соответствует только пробелам Latin-1, \p{javaWhitespace} соответствует всему, для чего Character.isWhitespace() верно. По какой-то причине это не включает несколько конкретных персонажей, которые я перечислил отдельно.

Дополнительная информация в документах для Шаблон.

Связанный с этим факт: хотя java.lang.String.trim() не удаляет неразрывные пробелы или пробелы цифр, котлин.String.trim() удаляет!

Подождите секунду, на самом деле это неверно, поскольку «\ u2000» на самом деле интерпретируется как «\ u2000» + «b», что является символом пробела «EN QUAD», за которым следует буква «b». Я вернул вопрос в его первоначальную форму, поскольку это то, что я намеревался.

James Riordan 21.05.2019 13:43

Ах да, в Java/Kotlin вам, вероятно, потребуется представить U+2000B как суррогатную пару… В любом случае, я уже отредактировал свой ответ, чтобы удалить эту неуместность, так что теперь мы просто запутываем всех остальных :-)

gidds 21.05.2019 13:48

Поскольку Java 7 Pattern позволяет указать флаг UNICODE_CHARACTER_CLASS, который в основном также будет работать для вашей текущей проблемы:

Pattern.compile("\\s+", Pattern.UNICODE_CHARACTER_CLASS)

К сожалению, это пока не поддерживается напрямую через RegexOption с Kotlins Regex. Есть известная проблема, в которой также описывается обходной путь (KT-21094):

string.split("""(?U)\s+""".toRegex())

Вам (скорее всего) требуется Java 7+, чтобы это действительно работало. Альтернативой может быть использование других предопределенных классов символов. Однако вам нужно найти соответствующий Pattern-javadoc для вашей версии Java, чтобы убедиться, что она действительно работает (или сделать это методом проб и ошибок ;-)).

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