Java regex pour sortir la bande des balises XML, mais pas de balise de contenu
J'ai le code Java suivant:
str = str.replaceAll("<.*?>.*?</.*?>|<.*?/>", "");
Cela transforme une Chaîne de caractères comme suit:
How now <fizz>brown</fizz> cow.
Dans:
How now cow.
Cependant, je veux juste la bande de la <fizz>
et </fizz>
balises, ou tout simplement autonome </fizz
> balises, et de laisser le contenu de l'élément seul. Donc, une regex qui serait à son tour le ci-dessus en:
How now brown cow.
Ou, à l'aide d'une Chaîne plus complexes, quelque chose qui tourne:
How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow.
Dans:
How now brown cow.
J'ai essayé ceci:
str = str.replaceAll("<.*?></.*?>|<.*?/>", "");
Et qui ne fonctionne pas du tout. Des idées? Merci à l'avance!
- habituellement, si
xml
etregex
les balises montrer ensemble, vous obtenez un commentaire, il est dit.... - Avez-vous essayé d'utiliser un analyseur XML? Je trouve ma vie beaucoup plus facile avec JDOM pour l'analyse de XML.
- Je ne peux pas entrer dans les détails, sans tomber dans un énorme trame de fond, mais ce n'est pas possible ici (Analyseur XML). Il suffit de regarder pour une regex solution.
- mettre un " | " entre le premier > et <.
- si vous voulez vraiment utiliser les regex, ne pas mentionner toute xml dans votre question, et de dire simplement "texte", :D... vous pouvez essayer de
replaceAll("<[^>]*>","")
- (Si vous vous poseriez la question, "Quel est le problème avec l'aide de regex avec xml?" here la réponse canonique, bien qu'en réalité, tant que question et de ce qui peut raisonnablement être fait avec la regex.)
Vous devez vous connecter pour publier un commentaire.
Vous avez été près de là 😉
Essayez ceci:
Alors qu'il y a d'autres réponses correctes, aucun ne donne aucune explication.
La raison de votre regex
<.*?>.*?</.*?>|<.*?/>
ne fonctionne pas c'est parce qu'il va sélectionner toutes les balises ainsi que tout l'intérieur de leur. Vous pouvez voir que dans l'action sur debuggex.La raison de votre deuxième tentative
<.*?></.*?>|<.*?/>
ne fonctionne pas c'est parce qu'il va sélectionner à partir du début d'une balise jusqu'à la première balise de fermeture à la suite d'une balise. C'est en quelque sorte d'une bouchée, mais vous pouvez mieux comprendre ce qu'il se passe dans cet exemple.La regex que vous avez besoin est beaucoup plus simple:
<.*?>
. Simplement, il sélectionne chaque balise, ignorant si c'est ouvrir/fermer. Visualisation.Vous pouvez essayer cela aussi:
Veuillez vous référer à l'exemple ci-dessous pour mieux comprendre:
De sortie:
<
et>
) n'ont aucune signification particulière dans les regexes, de sorte s'échapper de leur est inutile. En fait, dans certaines saveurs (mais pas Java)\<
et\>
sont utilisés pour faire correspondre les limites de mots, de sorte que cette "solution" serait de faire empirer les choses.Ce n'est pas élégant, mais il est facile à suivre. Le code ci-dessous supprime le début et la fin des balises XML s'ils sont présents dans une ligne de
<url>"www.xml.com"<\url> , <body>"This is xml"<\body>
Regex :
Si vous souhaitez analyser XML fichier journal de sorte que vous pouvez faire avec les regex {java},
<[^<]+<
.ainsi, vous obtenez<name>DEV</name>
. Sortie comme nom>DEV. Vous avez juste à jouer avec les REGEX.