2010-07-26 19 views
5

Geçerli bir C# stili düzenli ifadesine uyan bir regex ile nereden gelebileceğimi bilen var mı? Bu mümkün mü?Geçerli normal ifadeyle eşleşen Regex

FYI, bunu yapmaya çalışmamın nedeni, sözdiziminin bir parçası olarak düzenli ifadelere izin veren bir mini dile sahip olduğum ve mini dil ifadelerini doğrulamak için crummy regex'i birlikte ekledim ancak yanlış bir şekilde başarısız oluyor. biraz daha karmaşık ifadeler. Mini dil sözdizimi, eBNF ve normal ifadelerin bir kombinasyonuyla tanımlanır. Bunu C# 'da' doğrulama 'yapabilirim ama bu yaklaşımın mümkün olup olmadığını, en temiz ve en iyi endişelerin ayrılacağını düşünüyorum.

sayesinde Brian

+0

.NET flavorunda yazılmış regex ...? – kennytm

cevap

10

Hayır, yapamazsın. En azından genel olarak değil. Düzenli ifadeler normal dilleri tanımlar ve bunlar keyfi olarak iç içe geçmiş ifadeler içeremezler. Yani

(ab(?:cd)e(fg)) 

gibi bir şey tek başına normal ifadeler ile doğrulamak için zaten hemen hemen imkansızdır. Düzenli ifadelerin belirli tatları, bu işe uygun bir araç olan eşleşmeye (örneğin, Perl) veya bir takıma öykünebilecek dengeli yakalama gruplarına bir defada izin verirken, bu iş için kastedilen aletidir ve ayakkabı çekmeye çalışmamalısınız. birine.

Ne nedir yalnızca doğrulamak istediğiniz bir ifadeyi derlemeye çalışın. .NET'in normal ifade motoru, desen geçersizse bir istisna atar:

var compiledRegex = new Regex(someString); 
+0

Bu korkuyordum ama eğer tek seçenek buysa, onunla başa çıkmak zorundayım sanırım. Açıklama/açıklama için teşekkürler. –

+0

Uygulamanın akışını denetlemek için istisnalar kullanmak en iyi uygulama değildir, ancak normal ifadeler için bir doğrulayıcı yazma önemsiz değildir. –

+0

"Yeni Regex (someString)" satırını kullanıyorum; esas olarak normal ifadeyi doğrular. Doğrulanan dize teknik olarak kullanıcı girdisidir, bu nedenle kötü kullanıcı girdisi üzerinde bir istisna tutulması muhtemelen bununla başa çıkmak için en mantıklı yoldur. Sağ? –

İlgili konular