2009-10-12 17 views
25

Poszukuję wzorca regex, który zwróci mi zawartość pierwszego zestawu nawiasów w ciągu.Wzór Regex do zwracania tekstu z nawiasu

Na przykład

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

powróci "hello"

Czy ktoś wie, co wygląda jak wzór dla C#?

+1

Żądanie zmiany nagłówka. Czy słowo "nawias" nie powinno być użyte dla "[", a nie "(nawiasu)? - crokusek – crokusek

Odpowiedz

59

Wzór regexp będzie wyglądać mniej więcej tak:

\(([^)]*)\) 

autopsji Wzór:

\( - dosłownym "("

( - start podciąg wzorca:

[^)]* mecz 0 lub więcej znaków, które nie są ")" - uwaga: definiujemy grupę znaków, więc nie musimy tutaj uciec z postaci ).

) - koniec podciąg wzorca

\) - dosłownym „)

Pełne wzór będzie pasował do wsporników i tekst wewnątrz nich, pierwszy podciąg wzorca będzie pasował tylko tekst w nawiasie (patrz C# odniesienia jak je zdobyć - nie mówię C#;))

+1

Czy można to zaadaptować, aby nie zwracać samych nawiasów, tylko zawartość? – Grant

+2

To mi odpowiada. rzeczywisty znak "(", następnie uruchom grupę, a następnie dopasuj zero lub więcej znaków "nie"), a następnie zamknij grupę, a następnie dopasuj rzeczywisty znak ")". Wynikowa grupa powinna otrzymać dokładnie to, co było w parens. Ten przykład jest nieco mylący, ponieważ postac, aby rozpocząć grupę, akurat jest "(" i chcemy dopasować rzeczywiste "(" Aby wyłączyć "magię" znaku "(" i po prostu dopasować rzeczywiste ") ('Postać, wstawiamy pierwszy ukośnik odwrotny, tak jak "\\ (", jak tutaj pokazano – steveha

+0

To nie zwraca samych nawiasów. –

2

Bare regex:

\((.*?)\) 

W Pythonie można użyć go w ten sposób:

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

Czy python regex do chciwy dopasowanie tutaj? Zwracanie '(hello) text (hello2) (hello3)' jako pierwsze i jedyne dopasowanie? –

+0

OK, wyrażenie ". *?" jest nie-chciwą wersją ". *" w Pythonie. Czy działa również w języku C#? – steveha

+0

Hmm, nie-chciwa sztuczka prawdopodobnie działa w języku C#, zobacz "Dopasowanie luźnych i chciwych" na tej stronie: http://www.dijksterhuis.org/regular-expressions-in-csharp-the-basics/ – steveha

1

Jeśli ciągi są stosunkowo małe, można użyć zastąpić zamiast meczu:

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

To wrócisz tylko to, co jest w pierwszym zestawie nawiasów:

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); 
      } 
     } 
    } 
} 
Powiązane problemy