Как разбить на пробелах Юникод в Kotlin - PullRequest
1 голос
/ 21 мая 2019

В Kotlin, если мы используем:

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

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

val string = "a\u2000b"

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

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

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Поскольку 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, чтобы убедиться, что он действительно работает (или сделать это методом проб-ошибок; -)).

0 голосов
/ 21 мая 2019

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

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

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

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

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

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