Разделить пробел из строки, не работающей в Котлине

Кто-нибудь удивляется этому? Разделение SPACE (" ") в kotlin не работает, я пробовал разные коды регулярных выражений, но вообще не работает.

Пробовал с этим:

value.split("\\s")[0];
value.split("\\s+")[0];
value.split("\\s++")[0];

Затем я придумал решение -> Создать класс констант Java, который содержит эту функцию и возвращает массив строк в ваш класс kotlin.

Есть ли какое-либо другое решение этой проблемы, где мы можем напрямую достичь этого?

Решение: Как сказал @Edson Menegatti:

Специфика KOTLIN: РАБОТАЕТ

values.split("\\s".toRegex())[0]

Многие люди предлагали это решение: НЕ РАБОТАЕТ

values.split(" ")[0] 

Но в моем случае это не работает.


person Harsh Patel    schedule 22.01.2018    source источник
comment
вам не нужна точка с запятой, кстати.   -  person Héctor    schedule 22.01.2018
comment
на самом деле это код Java. : P я упомянул, что придумал это решение. ;)   -  person Harsh Patel    schedule 22.01.2018


Ответы (6)


Вот проблема между реализацией Java и Kotlin String.split.

В то время как реализация Java принимает строку регулярного выражения, реализация Kotlin этого не делает. Чтобы это работало, вам нужно предоставить фактический объект Regex.

Для этого вы должны обновить свой код следующим образом:

value.split("\\s".toRegex())[0]

Кроме того, как предложил @Thomas, вы можете просто использовать обычный символ пробела, чтобы разделить строку:

value.split(" ")[0]

Наконец, если вы используете только первый элемент списка разделения, вы можете рассмотреть возможность использования first() вместо [0] — для лучшей читаемости — и установить для параметра limit значение 2 — для лучшей производительности.

person Edson Menegatti    schedule 22.01.2018

Вам нужно использовать:

.toRegex()

fun main(args: Array<String>) {
        val str = "Kotlin com"

        val separate1 = str.split("\\s".toRegex())[0]
        println(separate1) // ------------------> Kotlin
}

ИЛИ

Вы также можете использовать .split(" ")[0] для достижения результата. Нравиться

fun main(args: Array<String>) {
            val str = "Kotlin com"

            val separate1 = str.split(" ")[0]
            println(separate1) // ----------> Kotlin
}
person Nikunj    schedule 22.01.2018

String#split (фактически CharSequence#split) может принимать либо обычный выражение или просто строка, которая интерпретируется буквально. Так:

value.split(" ")[0]

делает то, что вы хотите.

Если вы используете только первый элемент, эффективнее также передать limit = 2. Или, что еще лучше, используйте substringBefore.

person Thomas    schedule 22.01.2018
comment
Ваше утверждение неверно, String.split() также может принимать регулярное выражение, шаблон... - person AlexTa; 22.01.2018
comment
Спасибо @AlexTa, отредактировано. Мне не удалось прокрутить вниз достаточно далеко. - person Thomas; 22.01.2018
comment
Нет, эта вещь не работает в котлине, я уже пробовал с этим - person Harsh Patel; 22.01.2018
comment
@BabulPatel Если вы говорите, что что-то не работает, всегда указывайте код, который вы пробовали, а также сообщение об ошибке, а также ожидаемый и фактический результат. Вставьте println("Hello, world!".split(" ")[0]) в функцию main по адресу try .kotlinlang.org/#/Examples/Hello,%20world!/ и посмотрите, как будет напечатано Hello, по желанию. - person Thomas; 22.01.2018
comment
эта функция не разделяет строку. Он фактически возвращает строку как есть. @Томас - person Harsh Patel; 22.01.2018
comment
Тогда я должен сделать вывод, что символ в вашей строке не является пробелом. - person Thomas; 22.01.2018

Kotlin пытается решить некоторые проблемы, которые есть у библиотеки Java String. Например, Kotlin пытается быть более явным.

В результате метод split принимает обычный String и не использует его как регулярное выражение внутри:

"hello world".split("\\s")[0] //no match
"hello world".split(" ")[0] // => "hello"

Чтобы явно использовать перегруженную функцию split, которая фактически принимает регулярное выражение, можно использовать расширение toRegex() (inline fun String.toRegex(): Regex (source)):

"hello world".split("\\s".toRegex())[0]// => "hello"

Ниже показан еще один пример того, как Kotlin разрешает запутанный метод String::replaceAll:

введите здесь описание изображения

Взято из KotlinConf презентации Светланы Исаковой, соавтора «Kotlin в действии»

person s1m0nw1    schedule 22.01.2018

Один разделитель

 val splittedStringList = "123.345-80A".split(".")
 println(splittedStringList[0])

Несколько разделителей

 println("123.345-80A".split(".", "-"))

Использование регулярного выражения

 println("123.345-80A".split("\\.|-".toRegex()))

Попробуйте Kotlin онлайн

person Manikandan    schedule 21.02.2020

Просто используйте value.split("\s".toRegex())

1. Разбивает и повторяет все элементы

value.split("\\s".toRegex()).forEach { item ->
    //use item 
}

2.Плевать и использовать первый предмет

value.split("\\s".toRegex()).first()

3. Выплевывает и использует последний предмет

value.split("\\s".toRegex()).last()
person Roman    schedule 21.02.2020