Comment tronquer une corde dans groovy?
J'ai utilisé:
def c = truncate("abscd adfa dasfds ghisgirs fsdfgf", 10)
mais obtenir une erreur.
La communauté Groovy a ajouté une méthode take()
qui peut être utilisée pour une troncature facile et safe string.
Exemples:
"abscd adfa dasfds ghisgirs fsdfgf".take(10) //"abscd adfa"
"It's groovy, man".take(4) //"It's"
"It's groovy, man".take(10000) //"It's groovy, man" (no exception thrown)
Il existe également une méthode correspondante drop()
:
"It's groovy, man".drop(15) //"n"
"It's groovy, man".drop(5).take(6) //"groovy"
take()
et drop()
sont tous deux relatifs au start de la chaîne, comme dans "prendre de face" et "déposer de face".
Console Groovy en ligne pour exécuter les exemples:
https://ideone.com/zQD9Om - (remarque: l'interface utilisateur est vraiment mauvaise)}
Pour plus d'informations, voir "Ajouter une méthode de prise à Collections, Iterators, Arrays":
https://issues.Apache.org/jira/browse/GROOVY-4865
Dans Groovy, les chaînes peuvent être considérées comme des plages de caractères. En conséquence, vous pouvez simplement utiliser les fonctionnalités d'indexation de Groovy et faire myString[startIndex..endIndex]
.
Par exemple,
"012345678901234567890123456789"[0..10]
les sorties
"0123456789"
Pour éviter la rupture de Word, vous pouvez utiliser le Java.text.BreakIterator . Cela tronquera une chaîne à la limite de Word la plus proche après un nombre de caractères.
Exemple
package com.example
import Java.text.BreakIterator
class exampleClass {
private truncate( String content, int contentLength ) {
def result
//Is content > than the contentLength?
if(content.size() > contentLength) {
BreakIterator bi = BreakIterator.getWordInstance()
bi.setText(content);
def first_after = bi.following(contentLength)
//Truncate
result = content.substring(0, first_after) + "..."
} else {
result = content
}
return result
}
}
nous pouvons simplement utiliser les fonctionnalités d'indexation de Groovy et faire someString[startIndex..endIndex].
Par exemple:
def str = "abcdefgh"
def outputTrunc = str[2..5]
print outputTrunc
Console:
"cde"
Voici mes fonctions d'assistance pour résoudre ce problème. Dans de nombreux cas, vous voudrez probablement tronquer les mots par mot plutôt que les caractères, aussi j'ai collé la fonction pour cela également.
public static String truncate(String self, int limit) {
if (limit >= self.length())
return self;
return self.substring(0, limit);
}
public static String truncate(String self, int hardLimit, String nonWordPattern) {
if (hardLimit >= self.length())
return self;
int softLimit = 0;
Matcher matcher = compile(nonWordPattern, CASE_INSENSITIVE | UNICODE_CHARACTER_CLASS).matcher(self);
while (matcher.find()) {
if (matcher.start() > hardLimit)
break;
softLimit = matcher.start();
}
return truncate(self, softLimit);
}