Comme déjà mentionné par d'autres: regex ne convient pas pour une telle tâche. Cependant, si vos parenthèses ne dépassent pas un nombre fixe d'imbrications, vous pouvez le faire, mais si l'imbrication peut être de 3 ou plus, l'expression régulière deviendra difficile à écrire (et à maintenir!). Jetez un oeil à l'expression rationnelle qui correspond entre parenthèses avec au plus une parenthèse imbriquée dans ce:
\((?:[^()]|\([^)]*\))*\)
qui signifie:
\( # match the character '('
(?: # start non-capture group 1
[^()] # match any character not from the set {'(', ')'}
| # OR
\( # match the character '('
[^)]* # match any character not from the set {')'} and repeat it zero or more times
\) # match the character ')'
)* # end non-capture group 1 and repeat it zero or more times
\) # match the character ')'
La version pour 3 fera vos yeux saignent! Vous pourriez aller avec la fonctionnalité .NET de correspondance rationnelle récursive, mais personnellement, je n'irais pas: arroser la récursion à l'intérieur de la regex mène à la folie!(pas vraiment bien sûr, mais regex est assez difficile à comprendre et à mélanger récursion au mélange, ne rend pas plus clair IMO)
Je voudrais juste écrire une petite méthode qui pourrait ressembler à cet extrait de Python:
def find_parens(str):
matches = []
parens = 0
start_index = -1
index = 0
for char in str:
if char == '(':
parens = parens+1
if start_index == -1:
start_index = index
if char == ')':
parens = parens-1
if parens == 0 and start_index > -1:
matches.append(str[start_index:index+1])
start_index = -1
index = index+1
return matches
for m in find_parens("dfgdgdfg (aaa.bbb) sfd (c) fdsdfg ( ,ddd (eee))"):
print(m)
qui imprime:
(aaa.bbb)
(c)
( ,ddd (eee))
Je ne suis pas familier avec C#, mais le code Python ci-dessus lit comme code pseudo et ne prendrait pas beaucoup d'efforts pour convertir en C# Je présume.
Modèles imbriqués? C'est irrégulier. – kennytm
OK. si str est "dfgdgdfg (aaa.bbb) sfd (c) fdsdfg" Qu'est-ce qu'un motif pour obtenir tous les caractères entre accolades? :) – Laritari
@KennyTM: hehe, quand vont-ils jamais apprendre! – leppie