为什么带有正则表达式字符串的Kotlin String.split与Java不一样?

时间:2017-07-12 18:09:21

标签: java regex split kotlin

我有以下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

3 个答案:

答案 0 :(得分:11)

您应该使用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   ---^

答案 1 :(得分:2)

你可以打电话

str.split(Regex("{\\p{Punct}"))

答案 2 :(得分:1)

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

Kotlin中的大多数字符串操作方法(replacesplit等)可以同时使用StringRegex个参数,但您必须转换{{1} } String如果你想要特定于正则表达式的匹配。

可以使用RegexString.toRegex()

完成此转换
Regex(String)

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

如[@ 3}}中@ holi-java所提到的

这将匹配val str = "12+20*/2-4"; str.split("\\p{Punct}".toRegex()) //this str.split(Regex("\\p{Punct}")) //or this *之间的空字符串/。您可以使用["12","20","","2","4"]作为正则表达式来避免这种情况。 (虽然请注意Java为输出添加这个空字符串,除非还包含"\\p{Punct}+"。)