Expression régulière pour supprimer les balises XML et leur contenu

J’ai la chaîne suivante et je voudrais supprimer * et * (notez le contenu de balise supplémentaire à l’intérieur qui doit également être supprimé) sans utiliser un parsingur XML (overhead trop grand pour les petites chaînes).

 The big black cat sleeps. 

Toute expression rationnelle dans VB.NET ou C # fera l’affaire.

Si vous voulez juste supprimer toutes les balises de la chaîne, utilisez ceci (C #):

 try { yourssortingng = Regex.Replace(yourssortingng, "(< [be]pt[^>]+>.+?)", ""); } catch (ArgumentException ex) { // Syntax error in the regular expression } 

MODIFIER:

J’ai décidé d’append à ma solution une meilleure option. L’option précédente ne fonctionnerait pas s’il y avait des balises incorporées. Cette nouvelle solution devrait supprimer toutes les balises < ** pt *>, intégrées ou non. De plus, cette solution utilise une référence en arrière à la correspondance originale [be] afin que la balise de fin exacte correspondante soit trouvée. Cette solution crée également un object Regex réutilisable pour améliorer les performances de sorte que chaque itération ne doit pas recomstackr Regex:

 bool FoundMatch = false; try { Regex regex = new Regex(@"< ([be])pt[^>]+>.+?"); while(regex.IsMatch(yourssortingng) ) { yourssortingng = regex.Replace(yourssortingng, ""); } } catch (ArgumentException ex) { // Syntax error in the regular expression } 

NOTES COMPLÉMENTAIRES:

Dans les commentaires, un utilisateur a exprimé sa crainte que le “.” Pattern Matcher serait cpu intensive. Bien que cela soit vrai dans le cas d’un gourmand autonome ‘.’, L’utilisation du caractère non-gourmand ‘?’ fait en sorte que le moteur des expressions rationnelles regarde uniquement vers l’avant jusqu’à ce qu’il trouve la première correspondance du caractère suivant dans le motif, par opposition à un ‘glouton’. ‘ ce qui oblige le moteur à regarder en avant jusqu’à la fin de la chaîne. J’utilise RegexBuddy comme outil de développement regex, et il comprend un débogueur qui vous permet de voir les performances relatives des différents modèles de regex. Il commente également automatiquement vos expressions rationnelles si vous le souhaitez. J’ai donc décidé d’inclure ces commentaires ici pour expliquer l’utilisation des expressions rationnelles ci-dessus:

  // < ([be])pt[^>]+>.+? // // Match the character "< " literally «<» // Match the regular expression below and capture its match into backreference number 1 «([be])» // Match a single character present in the list "be" «[be]» // Match the characters "pt" literally «pt» // Match any character that is not a ">" «[^>]+» // Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» // Match the character ">" literally «>» // Match any single character that is not a line break character «.+?» // Between one and unlimited times, as few times as possible, expanding as needed (lazy) «+?» // Match the characters "" literally «pt>» 

Je suppose que vous voulez laisser tomber la balise entièrement?

 (.*?)|(.*?) 

Le ? après que * le rende non-gourmand, il essaiera de faire correspondre le moins de caractères possible.

Un problème que vous aurez est celui des tags nesteds. les choses ne verraient pas le second parce que le premier correspondait.

Pourquoi dites-vous que les frais généraux sont trop importants? Avez-vous le mesurer? Ou devinez vous?

Utiliser une expression rationnelle à la place d’un parsingur approprié est un raccourci que vous pouvez utiliser quand quelqu’un arrive avec quelque chose comme

Le moteur de regex .NET prend-il en charge les valeurs négatives? Si oui, alors vous pouvez utiliser

 (< ([eb])pt[^>]+>((?!).)+) 

Ce qui fait dormir le grand chat noir sur la chaîne ci-dessus si vous supprimez toutes les correspondances. Cependant, gardez à l’esprit que cela ne fonctionnera pas si vous avez nested des éléments bpt / ept . Vous pouvez également vouloir append \s à certains endroits pour permettre des espaces supplémentaires dans les éléments de fermeture, etc.

Si vous allez utiliser une expression rationnelle pour supprimer des éléments XML, vous devez vous assurer que votre XML d’entrée n’utilise pas d’éléments de différents espaces de noms ou ne contient pas de sections CDATA dont vous ne souhaitez pas modifier le contenu.

La manière correcte (c’est-à-dire à la fois performante et correcte) de le faire est d’utiliser XSLT. Une transformation XSLT qui copie tout sauf un élément spécifique dans la sortie est une extension sortingviale de la transformation d’identité. Une fois la transformation compilée, elle s’exécutera extrêmement rapidement. Et il ne contiendra aucun défaut caché.

Existe-t-il un moyen d’obtenir une solution globale de regex.pattern pour le type de texte XML? de cette façon, je vais me débarrasser de la fonction de remplacement et du shell utiliser l’expression rationnelle. Le problème est d’parsingr le <> entrant dans l’ordre ou non. Également le remplacement des caractères réservés comme ‘& et ainsi de suite. Fonctions de fonction de fonction d’ami Fonction de remplacement (ByVal str As String) As String Dim arrLessThan As New Collection Dim arrGreaterThan As New Collection If not IsDBNull (str) Then

  str = CStr(str) If Len(str) > 0 Then str = Replace(str, "&", "&") str = Replace(str, "'", "'") str = Replace(str, """", """) arrLessThan = FindLocationOfChar("< ", str) arrGreaterThan = FindLocationOfChar(">", str) str = ChangeGreaterLess(arrLessThan, arrGreaterThan, str) str = Replace(str, Chr(13), "chr(13)") str = Replace(str, Chr(10), "chr(10)") End If Return str Else Return "" End If 

End Function Friend Fonction ChangeGreaterLess (ByVal lh As Collection, ByVal gr As Collection, ByVal str As Ssortingng) As Ssortingng Pour i As Entier = 0 À lh.Count Si CInt (lh.Item (i))> CInt (gr.Item ( i)) Alors str = Remplacer (str, “< ", "<") ///////// problèmes //// End If

  Next str = Replace(str, ">", ">") 

End Function Friend Fonction FindLocationOfChar (ByVal chr As Char, ByVal str As Ssortingng) As Collection Dim arr As Nouvelle Collection Pour i As Entier = 1 À str.Length () – 1 Si str.ToCharArray (i, 1) = chr Alors arr. .Add (i) End If Next Return, fonction de fin

eu des problèmes à la marque de problème

c’est un xml standard avec différents tags que je veux parsingr ..

Avez-vous mesuré cela? J’ai rencontré des problèmes de performances avec le moteur regex de .NET, mais au contraire, j’ai analysé des fichiers XML d’environ 40 Go sans problème avec l’parsingur Xml (vous devrez toutefois utiliser XmlReader pour les chaînes plus volumineuses).

Veuillez poster un exemple de code réel et mentionner vos exigences en matière de performances: je doute que la classe Regex soit la meilleure solution si la performance compte.