2017-07-12 22 views
5

Mam następujący kod Java:dlaczego łańcuch podzielony przez ciąg regex w Kotlin nie jest taki sam w Javie?

String str = "12+20*/2-4"; 
List<String> arr = new ArrayList<>(); 

arr = str.split("\\p{Punct}"); 

//expected: arr = {12,20,2,4} 

chcę równoważny kod Kotlin, ale .split("\\p{Punct}") nie działa. Nie rozumiem dokumentację tutaj: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/split.html

+0

Może spróbuj '.split ("{\\ p {Punct}". ToRegex())' jak wspomniano : https://stackoverflow.com/questions/37070352/how-do-i-replace-duplicate-whitespaces-in-a-string-in-kotlin – River

+0

Nie To nie działa –

+2

@IlyaFedoseev powinieneś usunąć pierwszy znak ' {'. który wyrzuci 'PatternSyntaxException'. –

Odpowiedz

8

należy korzystając String#split(Regex) zamiast, na przykład:

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"] 

LUB można podzielić więcej interpunkcji s za pomocą \\p{Punct}+, na przykład:

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

ORodwróć zamiast tego użyj wyrażenia regularnego i użyj Regex#findAll, w ten sposób możesz dowiedzieć się liczb ujemnych. na przykład:

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

Można zadzwonić

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

Jak wspomniano in this question większości metod manipulacji ciąg w Kotlin są przeciążone wziąć zarówno surowe ciągi i regex. (To pytanie mówi o replace, ale jest to ten sam pomysł dla split). Obecnie split traktuje ten pierwszy ukośnik odwrotny jako znak ucieczki, zamiast rozpoznawać go jako wyrażenie regularne.

Możesz dodać toRegex() połączenia lub Regex opakowanie wewnątrz zaproszenia do split:

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

jak wspomniano przez @ holi-java w their answer to dopasuje pusty napis między * i / dając ["12","20","","2","4"] . Możesz użyć "\\p{Punct}+" jako swojego regex, aby tego uniknąć. (Choć należy zauważyć, że Java daje wyjście z ten pusty ciąg chyba + wliczone jest również tam.)

Powiązane problemy