2011-12-15 14 views
15

Chcę dopasować dowolne elementy w nawiasach, ale wynik musi również wykluczać nawiasy.C# Regex pasuje do dowolnego elementu w nawiasach

Przykłady:
Initialize (P90W)
hamulcowy (45x)

wynikowe:
990W
45X

Wyniki UWAGA bez nawiasów.

Próbowałem wykonać tę pracę, ale bezskutecznie. Próbowałem kilku wersji, ale wiem, że jest to prosta rzecz, której mi brakuje i nie chcę używać Zamiennika, aby to osiągnąć.

var item = "Brake(45X)" 
Regex searchTerm = new Regex(@"\((.*)\)"); 
var value = (searchTerm.Match(item).Groups.Count > 0) ? 
    searchTerm.Match(item).Groups[0].Value : string.Empty; 
+0

nie wiem C#, ale jest 'new Regex()' zakłada się podstawowy, rozszerzony lub PREG? Czy próbowałeś przełączać się, który zestaw nawiasów zawiera znaki odwrócone? Być może '\ (" oznacza "znacznik początku zakresu" i '(" oznacza literał paren? – ghoti

+0

To wygląda dobrze dla mnie, co się dzieje? 'Wartość' jest 'string.Empty'? –

+0

zwraca wartość (P90W) lub (45X) z nawiasami: –

Odpowiedz

27

Niektórzy ludzie oskarżają mnie o zerowej szerokości za pomocą twierdzenia cały czas:

resultString = Regex.Match(subjectString, @"(?<=\().+?(?=\))").Value; 

Ale robią dokładnie to, co chcesz. Nie przechwytuj tego, czego nie chcesz uchwycić.

+5

Dlaczego potrzebujesz wyprzedzania i lookbehind? '@" \ (([^ \)] *) \) "' jest znacznie prostsze, a 4 znaki krótsze :) – kol

+0

To jest świetne, komentarz kol jest również świetny, ale powiem, że odpowiedź FailedDev nauczyła mnie robić coś, czego wcześniej nie wiedziałem – Feign

0
Regex searchTerm = new Regex(@"\(([^\)]*)\)"); 
10

try regex @"\((.*?)\)"

EDIT: Również wynik będzie grupa 1 nie 0, grupa 0 powinny zawierać całą wynik regex, nie pierwsza wartość w nawiasach

+0

Przydatne! Potrzebne mi było znaleźć wszystkie części ciągów wewnątrz nawiasów klamrowych, więc użyłem tego prostego kodu: wzór ciągu = @ "{(. *?)}"; Dopasowanie w dopasowaniu = Regex.match (tekst, wzorzec); – Pisu

3

Usuń wewnętrzna paranthesis i spróbuj ponownie:

new Regex(@"(\([^\)]+\))"); 

Kiedy nie uciec od paranthesi s w regex, jeśli używasz dopasowania grupowego, to zwróci zawartość tylko w parantezie. Więc jeśli masz, new Regex(@'(a)(b))', mecz 1 będzie a, a mecz 2 będzie b. Mecz 0 to cały mecz.

+0

Jeden komentarz, jeśli chcesz zbyt pustą parantezę: (\ ([^ \)] * \)) – Dani

0

spróbuj tego:

var pattern = @".*public.*(.*\(.*\))"; 
Regex.Matches(input,pattern) 
Powiązane problemy