C # Regex – Comment supprimer plusieurs parenthèses appariées d’une chaîne

J’essaie de comprendre comment utiliser les expressions régulières C # pour supprimer toutes les occurrences de parenthèses appariées d’une chaîne. Les parenthèses et tout le texte entre eux doivent être supprimés. Les parenthèses ne sont pas toujours sur la même ligne. En outre, leurs parentés peuvent être nestedes. Un exemple de la chaîne serait

This is a (ssortingng). I would like all of the (parentheses to be removed). This (is) a ssortingng. Nested ((parentheses) should) also be removed. (Thanks) for your help. 

La sortie souhaitée doit être la suivante:

 This is a . I would like all of the . This a ssortingng. Nested also be removed. for your help. 

Heureusement, .NET permet la récursion dans les expressions rationnelles (voir Equilibrage des définitions de groupe ):

 Regex regexObj = new Regex( @"\( # Match an opening parenthesis. (?> # Then either match (possessively): [^()]+ # any characters except parentheses | # or \( (?) # an opening paren (and increase the parens counter) | # or \) (?<-Depth>) # a closing paren (and decrease the parens counter). )* # Repeat as needed. (?(Depth)(?!)) # Assert that the parens counter is at zero. \) # Then match a closing parenthesis.", RegexOptions.IgnorePatternWhitespace); 

Au cas où quelqu’un se demanderait: le “compteur parens” peut ne jamais descendre en dessous de zéro ( échouera sinon), donc même si les parenthèses sont “équilibrées” mais ne correspondent pas correctement (comme ()))((() ), cette expression rationnelle ne sera pas dupe.

Pour plus d’informations, lisez l’excellent livre de Jeffrey Friedl “Mastering Regular Expressions” (p. 436).

Vous pouvez remplacer de manière répétitive /\([^\)\(]*\)/g avec la chaîne vide jusqu’à ce qu’aucune correspondance ne soit trouvée, cependant.

Normalement, ce n’est pas une option. Cependant, Microsoft possède des extensions aux expressions régulières standard. Vous pourrez peut-être y parvenir avec Grouping Constructs même s’il est plus rapide de coder sous forme d’algorithme que de lire et de comprendre l’explication fournie par Microsoft concernant leur extension.

Que diriez-vous de ceci: Regex Replace semble faire l’affaire.

 ssortingng Remove(ssortingng s, char begin, char end) { Regex regex = new Regex(ssortingng.Format("\\{0}.*?\\{1}", begin, end)); return regex.Replace(s, ssortingng.Empty); } ssortingng s = "Hello (my name) is (brian)" s = Remove(s, '(', ')'); 

La sortie serait:

 "Hello is"