2009-10-12 22 views
25

Sto cercando un modello regex che restituisca il contenuto del primo set di parentesi in una stringa.Schema Regex per restituire il testo tra parentesi

Per esempio,

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

tornerà "hello"

Qualcuno sa che il modello appare come per C#?

+1

Richiesta di modifica del titolo. Non dovrebbe essere usata la parola "parentesi" per "[" e non "(" (parentesi)? - crokusek – crokusek

risposta

59

Il modello di espressione regolare sarebbe simile a questa:

\(([^)]*)\) 

modello autopsia:

\( - un letterale "("

( - inizio sotto-regola:

[^)]* partita 0 o più caratteri che non sono ")" - nota: stiamo definendo un gruppo di caratteri, quindi non dobbiamo sfuggire al carattere ) qui.

) - fine del sotto-regola

\) - un letterale ")"

Il modello completo abbinerà le staffe e il testo al loro interno, il primo criterio corrisponderà solo il testo all'interno delle parentesi (si veda C# di riferimento come ottenerli - non parlo C#;))

+1

Può essere adattato per non restituire le parentesi stesse? Solo il contenuto? – Grant

+2

Questo sembra corretto per me. un vero '(' carattere, quindi avviare un gruppo, quindi corrispondere a zero o più non '') 'caratteri, quindi chiudere il gruppo, quindi abbinare un carattere') 'reale. Il gruppo risultante dovrebbe ottenere solo ciò che era all'interno del paren. Questo esempio è un po 'confuso perché il personaggio che inizia un gruppo sembra essere "(" e stiamo cercando di far corrispondere un vero e proprio "(". "Disattivare la" magia "del carattere" ("e abbinare un vero" ('carattere, prima mettiamo una barra rovesciata, come "\\ (", come mostrato qui. – steveha

+0

Questo non restituisce le parentesi stesse. –

2

regex Bare:

\((.*?)\) 

In Python è possibile utilizzare in questo modo:

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

Non sarebbe regex python fare abbinamenti avidi qui? Restituendo '(ciao) testo (ciao2) (ciao3)' come prima e unica corrispondenza? –

+0

Ok, l'espressione ". *?" è una versione non greedy di ". *" in Python. Funziona anche in C#? – steveha

+0

Hmm, il trucco non-goloso probabilmente funziona in C#, vedi "Abbinamento Lazy e Greedy" in questa pagina: http://www.dijksterhuis.org/regular-expressions-in-csharp-the-basics/ – steveha

1

Se le stringhe sono relativamente piccole, è possibile utilizzare un sostituire invece di un partita:

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

Ciò restituirà voi solo ciò che si trova all'interno del primo set di parentesi:

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); 
      } 
     } 
    } 
} 
Problemi correlati