web-dev-qa-db-fra.com

Utilisation de vélocité split () pour diviser une chaîne en un tableau ne semble pas fonctionner

Je déteste la vélocité et l'utilise rarement, mais parfois, je suis appelé à le faire. Je n'arrive jamais vraiment à comprendre comment l'utiliser.

J'ai ceci

#foreach( $product in $browseSiteProducts )
    alert("$product.productId");
    #foreach( $stringList in $product.productId.split("|") )
        alert("inner loop");
    #end
#end

$ browseSiteProducts est un tableau. Ou liste. Ou peu importe. Je ne sais même pas. La première alerte du productId fonctionne bien. Je reçois "|" c'est ce à quoi je m'attendais lors de l'impression. La boucle interne devrait alors diviser cela sur le "|" comme délimiteur et donnez-moi des alertes de "boucle intérieure". Mais au lieu de cela, je reçois toujours 24 alertes car il y a 24 caractères dans le productId. alors split () ne délimite pas correctement pour moi. Qu'est-ce que je fais mal ??

Merci Kyle

12
kamcknig

Velocity a extrêmement peu d'objets et de méthodes qui lui sont propres. Au lieu de cela, il vous permet de travailler avec de vrais objets Java et d'appeler de vraies méthodes Java sur ces objets. Quelle documentation Velocity indique que le délimiteur est une chaîne?

De plus, Velocity étant basé sur Java, une string n'est qu'un type de données pouvant contenir plusieurs types d'informations: numéros de téléphone, noms, identifiants, expressions régulières ... En Java, de nombreuses méthodes traitant des expressions régulières transmettent ces RE sous la forme String objets.

Vous pouvez vérifier le type actuel d'une valeur derrière une variable en imprimant son nom de classe:

Product class is $product.class
Product ID class is $product.productId.class

Si l'ID de produit est bien un Java.lang.String , vous pouvez vérifier que la méthode split prend un paramètre String, mais que String devrait être une expression régulière valide.

Et puisque | est un caractère spécial dans les expressions régulières , vous devez l’échapper d’une manière ou d’une autre. Cela marche:

#foreach( $stringList in $product.productId.split("[|]") )
13
Sergiu Dumitriu

Sans utiliser StringUtils, vous pouvez utiliser la méthode String split().

Contrairement à son équivalent Java pour les caractères spéciaux, il n'est pas nécessaire d'échapper à la barre oblique (.e.g "\\|"), car @kamcknig a correctement déclaré:

#set ($myString = “This|is|my|dummy|text”) 

#set ($myArray = $myString.split("\|")) or
#set ($myArray = $myString.split('\|')) or
#set ($myArray = $myString.split("[|]"))

Note 1: Pour obtenir la taille du tableau, utilisez: $myArray.size()

Remarque 2: Pour obtenir les valeurs réelles, utilisez $myArray.get(0) ou $myArray[0]… etc.

Suggestion: on pourrait utiliser à l'avance #if ($myString.indexOf(‘|’)) ... #end

4
Ithar
## Splitting by Pipes
#set($prodId = $product.productId)
#foreach($id in $prodId.split("[|]"))
$id
#end
1
Bae Cheol Shin