首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么具有正则表达式字符串的Kotlin String.split不同于Java?

为什么具有正则表达式字符串的Kotlin String.split不同于Java?
EN

Stack Overflow用户
提问于 2017-07-13 02:09:21
回答 3查看 12.5K关注 0票数 22

我有以下Java代码:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-13 02:16:20

您应该改用String#split(Regex),例如:

代码语言:javascript
复制
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}+拆分更多的_Punctuation_s,例如:

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

OR反转正则表达式并使用Regex#findAll,您可以用这种方式找出负数。例如:

代码语言:javascript
复制
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   ---^
票数 26
EN

Stack Overflow用户

发布于 2017-07-13 02:19:24

对于正则表达式行为,参数必须是Regex类型的,而不仅仅是包含特殊正则表达式字符的String

Kotlin中的大多数字符串操作方法(replacesplit等)可以接受StringRegex参数,但如果希望进行特定于正则表达式的匹配,则必须将String转换为Regex

此转换可使用String.toRegex()Regex(String)完成

代码语言:javascript
复制
val str = "12+20*/2-4";
str.split("\\p{Punct}".toRegex()) //this
str.split(Regex("\\p{Punct}")) //or this

目前,split将第一个反斜杠视为转义字符,而不是将其识别为特殊的正则表达式序列。

正如their answer中的@holi-java所提到的,这将匹配*/之间的空字符串,从而提供["12","20","","2","4"]。您可以使用"\\p{Punct}+"作为正则表达式来避免这种情况。(但请注意,除非其中也包含+,否则Java使用这个空字符串提供输出。)

票数 6
EN

Stack Overflow用户

发布于 2017-07-13 02:18:34

你可以打电话给

代码语言:javascript
复制
str.split(Regex("{\\p{Punct}"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45064788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档