/ / Aide Regex requise - java, regex, groovy

Aide regex requise - java, regex, groovy

J'essaie de remplacer deux ou plusieurs occurrences de <br/> (comme <br/><br/><br/>) avec deux balises <br/><br/> avec le motif suivant

Pattern brTagPattern = Pattern.compile("(<\s*br\s*/\s*>\s*){2,}",
Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

Mais il y a des cas où "<br/> <br/>"les balises viennent avec un espace et elles sont remplacées par 4 <br/> balises qui devaient en fait être remplacées par seulement 2 balises.

Que puis-je faire pour ignorer 2 ou 3 (quelques) espaces entre les balises?

Réponses:

1 pour la réponse № 1

Probablement pas la réponse que vous voulez entendre, maisIl est généralement admis que vous ne devez pas essayer d'analyser XML / HTML avec des expressions régulières. Tant de choses peuvent mal tourner - c'est une bien meilleure idée d'utiliser une bibliothèque d'analyse spécifiquement destinée à de telles données, qui contournera également complètement le problème que vous rencontrez.

Jeter un coup d'œil à JAXB si vous êtes certain que votre HTML est un XML bien formé, ou si le HTML est susceptible d'être désordonné et non conforme (comme la plupart des HTML du monde réel), vous devriez essayer quelque chose comme TagSoup.


1 pour la réponse № 2

Voici du code Groovy pour tester votre Pattern:

import java.util.regex.*

Pattern brTagPattern = Pattern.compile( "(<\s*br\s*/\s*>\s*){2,}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL )
def testData = [
["",                            ""],
["<br/>",                       "<br/>"],
["< br/> <br />",               "<br/><br/>"],
["<br/> <br/><br/>",            "<br/><br/>"],
["<br/>   < br/ > <br/>",       "<br/><br/>"],
["<br/> <br/>   <br/>",         "<br/><br/>"],
["<br/><br/><br/> <br/><br/>",  "<br/><br/>"],
["<br/><br/><br/><b>w</b><br/>","<br/><br/><b>w</b><br/>"],
]

testData.each { inputStr, expected ->
Matcher matcher = brTagPattern.matcher( inputStr )
assert expected == matcher.replaceAll( "<br/><br/>" )
}

Et tout semble bien se passer ...


0 pour la réponse № 3

Vous pouvez faire cela en changeant un peu votre expression régulière:

Pattern brTagPattern = Pattern.compile("<\s*br\s*/\s*>\s*<\s*br\s*/\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

Cela ignorera tous les espaces entre deux
. Si vous voulez juste exactement 2 ou 3, vous pouvez utiliser:

Pattern brTagPattern = Pattern.compile("<\s*br\s*/\s*>(\s){2,3}<\s*br\s*/\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);