2013-01-18 15 views
12

Tüm örnekleri eşleştirilmiş parantezleri bir dizeden kaldırmak için C# normal ifadelerinin nasıl kullanılacağını anlamaya çalışıyorum. Parantez ve aralarındaki tüm metinler kaldırılmalıdır. Parantezler her zaman aynı satırda değildir. Ayrıca, yuvalanmış parantez olabilir. dizesi örneği aşağıdaki gibi arzu edilen çıkış olmalıdırC# Regex - Birden çok eşli parantezin dizgiden nasıl kaldırılacağı

This is a (string). I would like all of the (parentheses 
to be removed). This (is) a string. Nested ((parentheses) should) also 
be removed. (Thanks) for your help. 

olacaktır: In

Regex regexObj = new Regex(
    @"\(    # Match an opening parenthesis. 
     (?>    # Then either match (possessively): 
     [^()]+   # any characters except parentheses 
     |    # or 
     \((?<Depth>) # an opening paren (and increase the parens counter) 
     |    # or 
     \) (?<-Depth>) # a closing paren (and decrease the parens counter). 
    )*    # Repeat as needed. 
    (?(Depth)(?!)) # Assert that the parens counter is at zero. 
    \)    # Then match a closing parenthesis.", 
    RegexOptions.IgnorePatternWhitespace); 

: Neyse

This is a . I would like all of the . This a string. Nested also 
be removed. for your help. 
+1

İstediğiniz çıktıyı ekleyebilir misiniz? –

+0

Elbette. Gönderiyi güncelleyeceğim. –

+1

... ya da buraya: http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns –

cevap

21

, .NET regexes içinde Özyinelemeyi (Balancing Group Definitions bakınız) verir Herkes merak ediyor: "Parens sayacı" asla sıfırın altına düşmeyebilir (<?-Depth> aksi takdirde başarısız olur), bu yüzden parantezler "dengeli" olsa bile doğru şekilde eşleşmez (()))((() gibi), bu regex aldatılmayacaktır.

fazla bilgi için, artık eşleşme bulunursa girene kadar tekrar tekrar olsa boş dize ile /\([^\)\(]*\)/g yerine Jeffrey Friedl mükemmel kitabı "Mastering Regular Expressions" (s. 436)

+0

Çok güzel bir çözüm – msmucker0527

+0

Bu mükemmel çalıştı! Teşekkür ederim! –

+0

@MattBrandon - Bunu .NET'te yapmanın daha da kolay bir yolu var: [Dengeleme Grup Tanımları] (http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition). – JDB

0

Bu konuya ne dersiniz: Regex Replace hile yapmak gibi görünüyor.

string Remove(string s, char begin, char end) 
{ 
    Regex regex = new Regex(string.Format("\\{0}.*?\\{1}", begin, end)); 
    return regex.Replace(s, string.Empty); 
} 


string s = "Hello (my name) is (brian)" 
s = Remove(s, '(', ')'); 

Çıktı olacaktır:

"Hello is" 
+0

"Reheks.Escape()" yi "\\ {0}" ' – JDB

1

Normalde, bu bir seçenek değildir. Ancak, Microsoft, standart düzenli ifadeler için bazı uzantılara sahiptir. Bunu, Microsoft'un uzantılarını açıklamalarını okumak ve anlamaktan daha hızlı bir algoritma olarak kodlanmasına rağmen, Grouping Constructs ile bunu başarabilirsiniz.

+0

kullanarak daha iyi kullanacağınızı düşünüyorum. Aslında bu sorunu daha önce bugün işin yapılması için bir algoritma kodlayarak çözdüm. Ancak, bu algo paylaşmak için Regex –

+0

bakım ile yapılabilir olup olmadığı beni çok merak etti? – Zibri

İlgili konular