5 votes

Kotlin split avec regex ne fonctionne pas comme prévu

J'essaie de découper une chaîne de caractères en morceaux de 16 caractères. Je crée donc tout d'abord une chaîne de 64 caractères

val data = "Some string"
data = String.format("%-64s", data)

Je l'ai ensuite scindé avec une expression rationnelle

 val nameArray = data.split(Regex("(?<=\\G.{16})").toPattern())

Ici, j'espère obtenir 4 chunks de 16 caractères, mais je n'en ai obtenu que 2, le premier étant de 16 et le second de 48.

Où est-ce que je me trompe ?

Kotlin 1.2.61, Oracle JDK 1.8.0_181-b13, Windows 10

enter image description here

1voto

Smogen Points 98
data.chunked(16)

devrait suffire à résoudre le problème tel que vous l'avez décrit. Il devrait être disponible dans la version que vous utilisez, puisqu'il est documenté comme tel aquí .

J'ai essayé votre approche et celle de Keng mais avec des résultats très différents de ceux décrits ici.

https://pl.kotl.in/HJpQSfdqi

import java.net.URI
import java.util.*
import java.time.LocalDateTime
import java.time.temporal.*

/**
 * You can edit, run, and share this code. 
 * play.kotlinlang.org 
 */

fun main() {    
    var data = "Some string"
    data = String.format("%-64s", data)

    println(data.length)    
    // 1st approach
    var nameArray = data.split(Regex("(?<=\\G.{16})").toPattern())

    println(nameArray)
    nameArray.forEach{ it -> println(it.length) }
    println()

    // 2nd approach
    nameArray = data.split(Regex(".{16}").toPattern())

    println(nameArray)
    nameArray.forEach{ it -> println(it.length) }
    println()

    data.chunked(16).forEach{ it -> println(it.length) }
}

Lorsque j'exécute ce code, les méthodes regex proposées renvoient des tableaux de longueur 5, ce qui est dû à la présence d'un élément vide à la fin. Je ne comprends pas très bien pourquoi, mais j'espère que cela vous aidera à résoudre votre problème.

0voto

Keng Points 10618

Voici comment je l'ai divisé avec des expressions rationnelles

.{16}

Note : Je ne suis pas sûr de savoir ce que tous les autres éléments qui se trouvent là essaient de faire, peut-être des éléments spécifiques aux chaînes de caractères ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X