युक्त अगर कैसे सी # में regex का उपयोग कर परीक्षण करने के लिए:सी # सरल Regex - 32 वर्ण, केवल 0-9 और वायुसेना (GUID)
- स्ट्रिंग की लंबाई ठीक है 32
- स्ट्रिंग 0 से केवल संख्या शामिल वायुसेना से -9 और छोटे अक्षरों
युक्त अगर कैसे सी # में regex का उपयोग कर परीक्षण करने के लिए:सी # सरल Regex - 32 वर्ण, केवल 0-9 और वायुसेना (GUID)
कैसे के बारे में:
Regex regex = new Regex("^[0-9a-f]{32}$");
if (regex.IsMatch(text))
...
मुझे लगता है कि आप हाइफ़न आउट खो रहे हैं। –
@ सिमोनऑलिवरहर्ले: प्रश्न में विवरण से नहीं। "स्ट्रिंग में 0-9 से केवल संख्याएं हैं और af से छोटे अक्षर" - कोई उल्लेख नहीं है वहां एक हाइफ़न का। –
आप इस पु के लिए एक Regex का उपयोग करके पर नहीं मृत सेट कर रहे हैं rpose, यह बहुत साफ है:
Func<char, bool> charValid = c => (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
bool isValid = text.Length == 32 && text.All(charValid);
मैं रेगेक्स को दस लाख बार पसंद करता हूं। यह छोटा, साफ करने वाला, समझने और बदलने में आसान है, शायद और भी अधिक कुशल (न कि मैंने चेक किया है, या यह महत्वपूर्ण है)। - कुछ लोग इतने उत्सुक क्यों हैं उनसे बचने के लिए? –
@ मुझे व्यक्तिगत रूप से कॉनराड करें क्योंकि वे आमतौर पर इरादे से संवाद करने में बहुत बुरे होते हैं और आम तौर पर अधिक पठनीय विकल्पों से भी बदतर होते हैं। इस पैरा में टिकुलर केस मुझे सरल आवश्यकता नहीं है, हालांकि ग्रिड पर एक विधि को कॉल करना मेरा पसंदीदा विकल्प होगा यदि संभव हो तो –
@ कोनराड, मुझे रेगेक्स पसंद है, खासकर अधिक परिष्कृत कार्यों के लिए जिन्हें जटिल प्रासंगिक मिलान की आवश्यकता होती है। यदि समस्या अपेक्षाकृत सरल है, हालांकि, मैं अक्सर अधिक स्पष्ट दृष्टिकोण पसंद करता हूं, अगर केवल इसलिए कि मेरे सभी सहयोगियों के पास रेगेक्स की अच्छी कामकाजी समझ नहीं है। –
नेट 4.0 में वहाँ Guid
संरचना है कि TryParse
स्थिर कार्य है।
http://msdn.microsoft.com/en-us/library/system.guid.aspx
ठीक है, तो वहाँ एक जवाब यहाँ आप कैसे पता लगाने के लिए अगर यह स्ट्रिंग की लंबाई में 32 वर्ण है पता चलता है कि है, और हर किरदार के लिए या तो एक अंकों या लोअरकेस 'एक' एक regex के साथ 'एफ' को लोअरकेस में है , और दूसरा जो आपको दिखाता है कि इसे एक साधारण Func के साथ कैसे करना है जो स्ट्रिंग में वर्णों को स्कैन करता है। वे दोनों महान उत्तर और तकनीकी रूप से सही हैं, लेकिन आपके प्रश्न शीर्षक में आप स्पष्ट रूप से "GUID" बताते हैं जो कीड़े का एक नया उपयोग खोलता है।
GUID कई अलग-अलग स्ट्रिंग प्रस्तुतिकरण ले सकते हैं, और आप उनमें से किसी एक का सामना कर सकते हैं। क्या आपको इन सभी को संभालने की ज़रूरत है? क्या आपको तारों को समायोजित करने की आवश्यकता होगी जो घुंघराले ब्रेसिज़ ('{' और '}') या कोष्ठक के साथ शुरू और समाप्त हो जाएंगे? डैश के बारे में क्या ('-')? According to MSDN,
string s = ...;
Guid g = new Guid(s);
के साथ एक नया GUID बनाने निम्न रूपों
32 सन्निहित अंकों में स्ट्रिंग्स के लिए अनुमति देता है: dddddddddddddddddddddddddddddddd
-या-
समूह की 8, 4, समूहों के बीच हाइफ़न के साथ 4, 4, और 12 अंक । पूरे GUID वैकल्पिक ब्रेसिज़ या कोष्ठक मिलान में संलग्न किया जा सकता है: dddddddddddd-dddddddd-dddddddddddd
-या-
{dddddddddddd-dddddddd-dddddddddddd}
-या-
(dddddddddddd-dddddddd-dddddddddddd)
-या-
8, 4, और 4 अंकों के समूह, और "0x" या "0X" द्वारा पूर्ववर्ती प्रत्येक समूह के साथ 2 अंकों, के आठ समूहों का एक उप-समूह, और अल्पविराम से अलग किया गया।{0xdddddddd, 0xdddd, 0xdddd, {0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd}}
है: पूरे GUID है, साथ ही सबसेट, ब्रेसिज़ मिलान में संलग्न है आपको इन सभी मामलों को संभालने की ज़रूरत है? साथ ही, विचार करें कि रेगेक्स का उपयोग वास्तव में सर्वोत्तम विकल्प है। चूंकि कुछ लोगों ने पहले से ही टिप्पणी की है, रेगेक्स कुछ डेवलपर्स के लिए भ्रमित हो सकता है, और इरादा हमेशा स्पष्ट नहीं होता है। इसके शीर्ष पर, कुछ मामलों में regex धीमी हो सकता है।
मैं अगर एक स्ट्रिंग वास्तव में एक GUID के एक स्ट्रिंग प्रतिनिधित्व है का निर्धारण करने के तीन अलग अलग तरीकों पर एक त्वरित प्रदर्शन परीक्षण ऊपर मार पड़ी है दिए गए तार के साथ एक नया GUID उदाहरण (Guid बनाया जा सकता है, तो स्ट्रिंग एक मान्य स्ट्रिंग प्रतिनिधित्व है)
कोड यह रहा:
[टेस्ट]
public void Test_IsRegex_Performance()
{
Action withRegexMatch =() =>
{
Regex regex = new Regex("^[0-9a-f]{32}$");
Guid g = new Guid();
string s = g.ToString();
regex.IsMatch(s);
};
Action withCharCheck =() =>
{
Guid g = new Guid();
string s = g.ToString();
Func<char, bool> charValid = c => (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
bool isValid = s.Length == 32 && s.All(charValid);
};
Action withNewGuid =() =>
{
Guid g = new Guid();
string s = g.ToString();
try
{
Guid g2 = new Guid(s);
// if no exception is thrown, this is a valid string
// representation
}
catch
{
// if an exception was thrown, this is an invalid
// string representation
}
};
const int times = 100000;
Console.WriteLine("Regex: {0}", TimedTask(withRegexMatch, times));
Console.WriteLine("Checking chars: {0}", TimedTask(withCharCheck, times));
Console.WriteLine("New Guid: {0}", TimedTask(withNewGuid, times));
Assert.Fail();
}
private static TimeSpan TimedTask(Action action, int times)
{
Stopwatch timer = new Stopwatch();
timer.Start();
for (int i = 0; i < times; i++)
{
action();
}
timer.Stop();
return timer.Elapsed;
}
और मेरे मशीन पर एक लाख पुनरावृत्तियों से परिणाम:
Regex: 00:00:10.1786901
Checking chars: 00:00:00.2504520
New Guid: 00:00:01.3129005
तो, regex समाधान धीमी है। खुद से पूछें कि क्या आप वास्तव में यहां एक रेगेक्स की आवश्यकता है। ध्यान दें कि आप शायद एक बार फिर से रेगेक्स घोषित करके कुछ और निष्पादन कर सकते हैं, और इसका पुन: उपयोग कर सकते हैं, लेकिन मुझे लगता है कि इस मामले में बिंदु यह है कि को देखकर आपको बेहतर सफलता मिल सकती है, जैसा कि आप पूरा करने की कोशिश कर रहे हैं का विरोध कैसे।
उम्मीद है कि मदद करता है।
बेंचमार्क पूरी तरह से अनुचित और प्रतिनिधि नहीं है। कम से कम, अभिव्यक्ति का निर्माण एक बार करें और इसका पुन: उपयोग करें। इसके अलावा, एक * संकलित * नियमित अभिव्यक्ति समाधान भी आज़माएं। इससे इस विशेष अभिव्यक्ति के लिए कोई फर्क नहीं पड़ता है, लेकिन फिर, यह हो सकता है। 'नए ग्रिड' के लिए भी चला जाता है। 'Try' ब्लॉक को हटाएं और इसके बजाय 'Guid.TryParse' का उपयोग करें। –
कुछ बिंदु: मैं अपनी पोस्ट के साथ क्या चला रहा था यह था कि गुड्स कई अलग-अलग रूप ले सकते हैं, इसलिए पोस्टर कोड को इसे संभालने की आवश्यकता है। मैंने इस तथ्य को संबोधित किया कि रेगेक्स को एक बार घोषित किया जा सकता है और पुन: उपयोग किया जा सकता है। इसके अलावा, Guid.TryParse केवल .NET 4.0 में मौजूद है, इसलिए मैंने कोशिश नहीं की - मैं डर दूंगा कि प्रदर्शन कुछ नया ग्रिड इंस्टेंस (शायद थोड़ा तेज़) बनाने के समान होगा। – matt
अंत में, कई डेवलपर्स के लिए रेगेक्स मुश्किल होने के बारे में बिंदु अभी भी खड़ा है, मुझे लगता है। इरादा हमेशा स्पष्ट नहीं होता है, और जब तक उनका उपयोग करने के लिए एक बहुत ही विशिष्ट कारण नहीं है (उदाहरण के लिए, यह जांचना कि पाठ सभी संख्यात्मक है या एक अच्छी तरह से गठित फोन नंबर है), मैं शायद ही कभी उन्हें छूता हूं। आपकी माइलेज भिन्न हो सकती है। – matt
आपने क्या प्रयास किया है? यह आपके लिए कैसे काम करता है? किस तरह की चीजें काम नहीं करतीं? हमलोग यहां सहायता करने के लिए हैं। काम नहीं करना –
मुझे पता है कि लंबाई की जांच कैसे करें या 0-9 या उससे अधिक की जांच करें, लेकिन मैं उन सभी को गठबंधन नहीं कर सकता :( –
यदि आप उन चीजों को पोस्ट करते हैं जो आपने –