2008-10-20 11 views
36

मैं उपयोगकर्ताओं को संबंधित सिस्टम में आईपी निस्पंदन करने के लिए आईपी पते से मेल खाने के लिए नियमित अभिव्यक्ति दर्ज करने की अनुमति देता हूं। मैं मान्य करना चाहता हूं कि दर्ज किए गए नियमित अभिव्यक्तियां बहुत से उपयोगकर्ताओं के रूप में मान्य हैं, हालांकि अच्छे इरादों के साथ, मैस ओप होगा।क्या मैं परीक्षण कर सकता हूं कि रेगेक्स सी # में अपवाद फेंकने के बिना मान्य है

मैं निश्चित रूप से एक Regex.IsMatch() को कोशिश/पकड़ के अंदर कर सकता हूं और देख सकता हूं कि यह उस तरह से उड़ाता है, लेकिन क्या ऐसा करने के कोई स्मार्ट तरीके हैं? गति इस तरह कोई मुद्दा नहीं है, मैं किसी भी कारण से अपवाद फेंकने से बचना पसंद करता हूं।

+0

क्या आपका मतलब वास्तविक रेगेक्स बनाने पर उड़ रहा है? नया regex (str)? –

+0

उपयोगकर्ताओं को प्रत्येक ऑक्टेट (या एक समान समाधान) के लिए प्रारंभ और समाप्ति मान दर्ज करने की अनुमति देना Regex के बजाय विचार करने योग्य हो सकता है। – Greg

+0

यदि आप अपने आईपी एड्रेस रेगेक्स श्रेणियों के लिए हैं तो आप सीआईडीआर (1 9 2.168.0.0/24) का उपयोग करने पर भी विचार कर सकते हैं। http: //en.wikipedia।संगठन/विकी/सीआईडीआर –

उत्तर

34

जब तक आप बहुत विशिष्ट अपवादों को पकड़ते हैं, तो बस प्रयास करें/पकड़ें।

अपवाद सही ढंग से उपयोग किए जाने पर बुरा नहीं हैं।

+19

प्रदर्शन प्रभावों के अलावा दुर्भाग्यवश (परिदृश्य-विशिष्ट, मुझे पता है), और अपवाद प्रकार बहुत सामान्य होने पर डिबगिंग में व्यवधान (ArgumentException इस के लिए भयानक है)। मुझे 'Regex.TryParse()' को .NET किसी दिन में पेश किया जाना पसंद है :) –

0

मेरे पास यह जांचने का एक तरीका है कि क्या RegEx मान्य है, लेकिन यह केवल कोशिश/पकड़ में रेगेक्स को लपेटता है। मुझे यकीन नहीं है कि ऐसा करने का एक बेहतर तरीका है, लेकिन मुझे कोई नहीं मिला।

1

एक विकृत रेगेक्स अपवाद के लिए सबसे खराब कारण नहीं है।

जब तक आप एक बहुत regex वाक्य रचना की सीमित सबसेट के इस्तीफा देने के - और फिर उस के लिए एक regex (या एक पार्सर) लिखने - मुझे लगता है कि आप परीक्षण का कोई दूसरा रास्ता नहीं है अगर यह मान्य है, लेकिन एक बनाने की कोशिश करने के लिए इससे मशीन मशीन और इसे कुछ मैच बनाते हैं।

4

बहुत सारे काम के बिना नहीं। रेगेक्स पार्सिंग काफी शामिल हो सकती है, और अभिव्यक्ति को सत्यापित करने के लिए फ्रेमवर्क में कुछ भी सार्वजनिक नहीं है।

सिस्टम.Text.RegularExpressions.RegexNode.ScanRegex() एक अभिव्यक्ति को पार करने के लिए जिम्मेदार मुख्य कार्य प्रतीत होता है, लेकिन यह आंतरिक है (और किसी भी अवैध वाक्यविन्यास के लिए अपवाद फेंकता है)। तो आपको पार्स कार्यक्षमता को फिर से कार्यान्वित करने की आवश्यकता होगी - जो निस्संदेह किनारे के मामलों या फ्रेमवर्क अपडेट पर विफल हो जाएगी।

मुझे लगता है कि केवल ArgumentException को पकड़ना एक अच्छा विचार है जैसा कि आपको इस स्थिति में होने की संभावना है।

+1

हमारे पास संभावित रूप से विकृत संख्याओं से निपटने के लिए TryParse है। हमारे पास एक ही काम करने के लिए TryRegex होना चाहिए - अपवाद के बजाय विफलता लौटाएं। उपयोगकर्ता द्वारा दर्ज रेगेक्स को डिबग करना परेशान है! –

0

.NET में, जब तक कि आप अपना स्वयं का नियमित अभिव्यक्ति पार्सर नहीं लिखते (जिसे मैं दृढ़ता से सलाह देता हूं), आपको लगभग निश्चित रूप से नए रेगेक्स ऑब्जेक्ट को एक कोशिश/पकड़ के साथ लपेटने की आवश्यकता होगी।

1

इस पर निर्भर करता है कि इसके लिए लक्ष्य कौन है, मैं बहुत सावधान रहूंगा। रेगेक्स का निर्माण करना मुश्किल नहीं है जो स्वयं पर बैकट्रैक कर सकते हैं और बहुत सी सीपीयू और मेमोरी खा सकते हैं - वे सेवा वेक्टर का प्रभावी अस्वीकार हो सकते हैं।

+0

क्या .NET regex पार्सिंग लाइब्रेरी में कोई "स्टैक ओवरफ़्लो" सुरक्षा नहीं है? क्या आप मुझे एक उदाहरण दे सकते हैं जो मुझे परेशानी दे सकता है? –

+2

Regex.IsMatch ("bbbbbbbbbb", "(। *) {50} a"); – Hound

+2

.NET 4.5 के साथ, आप अपने रेगेक्स ऑब्जेक्ट – Sparky

39

मुझे लगता है कि इस मामले में अपवाद ठीक हैं।

यहाँ मैं एक साथ रखा है:

private static bool IsValidRegex(string pattern) 
{ 
    if (string.IsNullOrEmpty(pattern)) return false; 

    try 
    { 
     Regex.Match("", pattern); 
    } 
    catch (ArgumentException) 
    { 
     return false; 
    } 

    return true; 
} 
+1

पर टाइमआउट मान जोड़ सकते हैं। मुझे आश्चर्य है कि जेआईटी कंपाइलर स्मार्ट या गूंगा हो सकता है ताकि पूरे प्रयास कैच ब्लॉक को अनुकूलित किया जा सके क्योंकि शुद्ध फ़ंक्शन का रिटर्न वैल्यू उपयोग नहीं किया जाता है? – deerchao

+0

'MMatch() ''मिलान()' से कोई तेज़/बेहतर होगा, यह देखते हुए कि हम वास्तव में एक मैच नहीं करना चाहते हैं? वास्तव में कारकों को खोजने की तुलना में प्रारंभिकता के परीक्षण की तरह असीम (अच्छी तरह से, लगभग) तेज है। – dotNET

+0

'IsMatch()' [कॉल] (https://github.com/dotnet/corefx/blob/master/src/System.Text.RegularExpressions/src/System/Text/RegularExpressions/Regex.cs) 'आंतरिक मिलान रन ('त्वरित' int ' यह मेरे सरल परीक्षणों के अनुसार वास्तव में थोड़ा तेज़ है, लगभग ** 1-5% **। –

0

निम्नलिखित विधि का उपयोग कर आप जाँच कर सकते हैं मौसम अपने reguler अभिव्यक्ति मान्य है या नहीं। यहां testPattern वह पैटर्न है जिसे आप जांचना चाहते हैं।

public static bool VerifyRegEx(string testPattern) 
{ 
    bool isValid = true; 
    if ((testPattern != null) && (testPattern.Trim().Length > 0)) 
    { 
     try 
     { 
      Regex.Match("", testPattern); 
     } 
     catch (ArgumentException) 
     { 
      // BAD PATTERN: Syntax error 
      isValid = false; 
     } 
    } 
    else 
    { 
     //BAD PATTERN: Pattern is null or blank 
     isValid = false; 
    } 
    return (isValid); 
} 
संबंधित मुद्दे