Comme un exercice d'apprentissage personnel, j'ai écrit ce regex pour diviser une chaîne unaire en plusieurs parties dont la longueur augmente les pouvoirs de deux (see also on ideone.com):question d'optimisation Regex
for (String s :
new String(new char[500])
.split("(?=(.*))(?<=(?<=(^.*))\\G.*)(?<=(?=\\2\\2.\\1)^.*)")
) {
System.out.printf("%s ", s.length());
}
// prints "1 2 4 8 16 32 64 128 245 "
Il utilise une combinaison de capture pendant lookarounds, lookarounds imbriqués, correspondant sur backreferences, et lookbehind longueur infinie (qui n'est pas officiellement pris en charge en Java, mais fonctionne quand même). Les propriétés des sommes de puissances de deux et le fait que la chaîne a un alphabet unaire est également utilisé.
Cette solution est à la fois illisible et a une performance horrible.
Ma question est, comment voulez-vous "optimiser" cette regex?
- Pouvez-vous faire le regex plus lisible (il est normal si elle exécute pire)
- Pouvez-vous faire le regex fonctionne mieux (il est normal si elle est moins lisible)
Je considère que jouer avec regexes à être Amusant, mais c'est totalement masochiste – Amarghosh
@Amargosh: il était frustrant d'écrire douloureusement, jusqu'à ce que je l'ai eu à travailler. Puis c'est devenu hédoniste. – polygenelubricants
Quelle est l'horreur de ses performances sur Java? Sur .NET, il divise une chaîne de caractères de 10k en 4 secondes. – Jens