2009-10-12 6 views
25

Je cherche un motif regex qui me renverra le contenu du premier ensemble de parenthèses dans une chaîne.Motif Regex pour renvoyer le texte entre parenthèses

Par exemple,

text text text text (hello) text (hello2) (hello3) text 

retournera "hello"

Est-ce que quelqu'un sait ce que le modèle ressemble à C#?

+1

demande de changement global. Le mot 'bracket' ne devrait-il pas être utilisé pour '[' et not a '(' (parenthèses)? - crokusek – crokusek

Répondre

59

Le motif regexp ressemblerait à quelque chose comme ceci:

\(([^)]*)\) 

autopsie Motif:

\( - un littéral "("

( - début de subpattern:

[^)]* match de 0 ou plusieurs caractères qui ne sont pas ")" - note: nous définissons un groupe de caractères, donc nous n'avons pas besoin d'échapper au personnage ) ici.

) - fin de subpattern

\) - un littéral « ) »

Le modèle complet correspondra les crochets et le texte à l'intérieur eux, la première subpattern correspondra uniquement le texte à l'intérieur des crochets (voir C# référence comment les obtenir - je ne parle pas C#;))

+1

Cela peut-il être adapté pour ne pas renvoyer les crochets eux-mêmes? Seulement le contenu? – Grant

+2

Cela me semble correct. un caractère '(', puis un groupe, puis un ou plusieurs caractères non ''), puis fermez le groupe, puis faites correspondre un caractère ')'. Le groupe résultant devrait obtenir exactement ce qui était à l'intérieur des parens. Cet exemple est légèrement déroutant parce que le personnage pour démarrer un groupe se trouve juste être '(' et nous cherchons à correspondre à un réel '('. 'Pour désactiver la' magie 'du' '' et juste correspondre à un réel ' ('caractère, nous mettons d'abord une barre oblique inversée, comme "\\ (", comme montré ici – steveha

+0

Ceci ne retourne pas les crochets eux-mêmes –

2

regex nu:

\((.*?)\) 

En Python, vous pouvez l'utiliser de cette façon:

import re 

rx = re.compile(r'\((.*?)\)') 
s = 'text text text text (hello) text (hello2) (hello3) text' 
rxx = rx.search(s) 
if rxx: 
    print(rxx.group(1)) 
+0

Est-ce que python regex ne ferait pas de correspondance ici? Renvoyer '(bonjour) texte (hello2) (hello3)' comme première et seule correspondance? –

+0

D'accord, l'expression ". *?" est une version non gourmande de ". *" en Python. Est-ce que ça marche aussi en C#? – steveha

+0

Hmm, l'astuce non gloutonne fonctionne probablement en C#, voir "Correspondance paresseuse et gourmande" dans cette page: http://www.dijksterhuis.org/regular-expressions-in-csharp-the-basics/ – steveha

1

Si les chaînes sont relativement faibles, vous pouvez utiliser un remplacer au lieu d'un match de:

string s = Regex.Replace("text text text text (hello) text (hello2) (hello3) text", @"^.*?\(([^)]*)\).*$", "$1"); 
5

Cela vous ramènera que ce qui est dans le premier jeu de supports:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Match match = Regex.Match("foo bar (first) foo bar (second) foo", @"\((.*?)\)"); 

      if (match.Groups.Count > 1) 
      { 
       string value = match.Groups[1].Value; 
       System.Console.WriteLine(value); 
      } 
     } 
    } 
} 
Questions connexes