почему String, разделенная с регулярной строкой в ​​Kotlin, не совпадает с Java?

У меня есть следующий код Java:

String str = "12+20*/2-4"; List<String> arr = new ArrayList<>(); arr = str.split("\\p{Punct}"); //expected: arr = {12,20,2,4} 

Я хочу эквивалентный код Kotlin, но .split("\\p{Punct}") не работает. Я не понимаю документацию здесь: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/split.html

вам следует использовать String#split(Regex) , например:

 val str = "12+20*/2-4"; val arr = str.split("\\p{Punct}".toRegex()); // ^--- but the result is ["12","20","","2","4"] val arr2 = arr.filter{ !it.isBlank() }; // ^--- you can filter it as further, and result is: ["12","20","2","4"] 

ИЛИ вы можете разделить более пунктуацию с помощью \\p{Punct}+ , например:

 val arr = str.split("\\p{Punct}+".toRegex()) // ^--- result is: ["12","20","2","4"] 

ИЛИ инвертируйте регулярное выражение и вместо этого используйте Regex#findAll , и вы можете найти отрицательные числа таким образом. например:

 val str ="12+20*/2+(-4)"; val arr ="(?<!\\d)-?[^\\p{Punct}]+".toRegex().findAll(str).map{ it.value }.toList() // ^--- result is ["12","20","2","-4"] // negative number is found ---^ 

Как упоминалось в этом вопросе, большинство методов манипуляции строкой в ​​Kotlin перегружены, чтобы взять как необработанные строки, так и регулярные выражения. (Эти вопросы говорят о replace но это та же идея для split ). В настоящее время split обрабатывает эту первую обратную косую черту как escape-символ вместо того, чтобы распознавать ее как регулярное выражение.

Вы можете добавить toRegex() или оболочку Regex внутри вашего разговора:

 val str = "12+20*/2-4"; str.split("\\p{Punct}".toRegex()) //this str.split("Regex(\\p{Punct}")) //or this 

как упоминается @ holi-java в их ответе, это будет соответствовать пустой строке между * и / give ["12","20","","2","4"] . Вы можете использовать "\\p{Punct}+" качестве своего регулярного выражения, чтобы избежать этого. (Хотя обратите внимание, что Java дает результат с этой пустой строкой, если туда не включен + .)

Вы можете позвонить

 str.split(Regex("{\\p{Punct}")) 
Intereting Posts
Зачем получать класс в Котлин, используя двойную двоеточие (: :)? Загрузка файла с удаленного устройства и сохранение его на устройстве Android Параметр типа Ketlin reified как параметр функции Как слить два набора перечислений в kotlin с одним и тем же родительским интерфейсом? Цвет фона и перетасовка изображений в режиме прокрутки в recyclerView Android с помощью группового адаптера Использование констант kotlin в выражении java switch Ошибка Dagger2: Kotlin: Неразрешенная ссылка: DaggerSOMETHINGComponent Kotlin и TornadoFX: привязать наблюдаемое свойство к функции коллекции? anko doAsync onComplete Объявление поля статического интерфейса в Котлине Float – это недопустимое поле для сравнения Realm Как управлять ресурсами тестирования модулей в Котлине, например, запускать / останавливать соединение с базой данных или встроенный сервер elasticsearch? Возможно ли скомпилировать Kotlin Native без проверок времени выполнения? Есть ли способ отключить ковариантность сайта в Котлине? Как запустить другой файл .kt / Class в той же папке src?