Regex?

2010-07-21 17 views
55

मैं नियमित रूप से अभिव्यक्तियों में पूरी तरह असमर्थ हूं, और इसलिए मुझे किसी समस्या के साथ कुछ मदद चाहिए जो मुझे लगता है कि नियमित अभिव्यक्तियों का उपयोग करके सबसे अच्छा हल किया जाएगा।Regex?

मैं सी # में तार की सूची है:

List<string> lstNames = new List<string>(); 
lstNames.add("TRA-94:23"); 
lstNames.add("TRA-42:101"); 
lstNames.add("TRA-109:AD"); 

foreach (string n in lstNames) { 
    // logic goes here that somehow uses regex to remove all special characters 
    string regExp = "NO_IDEA"; 
    string tmp = Regex.Replace(n, regExp, ""); 
} 

मैं कोई विशेष वर्ण के बिना प्रत्येक आइटम वापस सूची पर पाश करने में सक्षम हो सकता है और की जरूरत है। उदाहरण के लिए, आइटम एक "TRA9423" होगा, आइटम दो "TRA42101" होगा और आइटम तीन TRA109AD होगा।

क्या कोई नियमित अभिव्यक्ति है जो मेरे लिए यह पूरा कर सकती है?

इसके अलावा, सूची में 4000 से अधिक आइटम हैं, इसलिए मुझे खोज की आवश्यकता है और यदि संभव हो तो त्वरित और त्वरित हो।

संपादित करें: मुझे यह निर्दिष्ट करना चाहिए था कि मेरे परिस्थिति में ए-जेड, ए-जेड और 0-9 के बगल में कोई भी चरित्र विशेष है।

+2

4000 आइटम की एक बहुत छोटी संख्या है। यह इतना महत्वपूर्ण क्यों है कि उत्तर पढ़ने योग्य और रखरखाव के बजाय उत्तर कुशल और त्वरित है? क्या आपने यहां एक प्रदर्शन मुद्दा मापा है? –

+0

@ मार्क - यह मेरी अज्ञानता दिखा रहा है, मुझे लगता है। 4000 मुझे बहुत कुछ लगता है, लेकिन मैं स्पष्ट रूप से गलत हूँ। मैंने कोई बेंचमार्क नहीं किया है, लेकिन रेगेक्स वैसे भी बहुत तेज़ प्रतीत होता है, इसलिए मुझे नहीं लगता कि मुझे कुछ भी तेज करने के साथ गड़बड़ करने की ज़रूरत है। मैं वास्तव में अपने उदाहरण को थोड़ा सा सरल बना दूंगा, क्योंकि मैं अपने प्रश्न को निर्विवाद रूप से दृढ़ता से नहीं करना चाहता था। मेरे पास वास्तव में जटिल वर्ग वस्तुओं की एक सूची है, और मैं सभी मैचों को खोजने के लिए एक प्रतिनिधि समारोह के साथ .FindAll का उपयोग कर रहा हूं। Regex मेरी कक्षा पर एक संपत्ति में खेलने के लिए आता है जो प्रतिनिधि समारोह के लिए एक निश्चित स्ट्रिंग में हेरफेर करने के लिए regex का उपयोग करता है। – Jagd

+0

आपकी मदद के लिए सभी को धन्यवाद! क्या यह सब आपके जैसे प्रतिभाओं के लिए इस तरह के आसान थे। : डी – Jagd

उत्तर

91

यह वास्तव में विशेष वर्णों की आपकी परिभाषा पर निर्भर करता है। मुझे लगता है कि बजाय एक काली सूची से एक श्वेत सूची ज्यादातर स्थितियों में सबसे अच्छा तरीका है:

tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", ""); 

आप अपने वर्तमान दृष्टिकोण के साथ सावधान क्योंकि निम्न दो आइटम एक ही स्ट्रिंग में परिवर्तित हो जाएगा और इसलिए पृथक किया जाएगा किया जाना चाहिए:

"TRA-12:123" 
"TRA-121:23" 
+0

'+' क्वांटिफायर अनावश्यक है। यदि चरित्र मेल खाता है, तो यह इनके लगातार क्रम में भी मेल खाता है। –

+4

@ डैनियल, मैं उम्मीद करता हूं कि ऑपरेशन को काफी तेज़ कर दिया जाए, बेशक यह वास्तव में कोई फर्क नहीं पड़ता जब तक कि आपकी प्रसंस्करण कुछ बड़ी न हो। –

+0

इससे कोई फर्क नहीं पड़ता कि दोनों आइटम एक जैसे होंगे, क्योंकि मैं एक अस्पष्ट मैच कर रहा हूं और मुझे उम्मीद है कि कई आइटम लौटाएंगे। सूची lstPax = lstReports.FindAll (प्रतिनिधि (पीडीएफ एंडएक्सएमएल ओ) {वापसी (ओ। पैकेड। कंटेनर (findTxt));}); पैक किया गया वह प्रॉपर्टी है जहां मैं PdfAndXml क्लास की एक निश्चित स्ट्रिंग विशेषता में हेरफेर करने के लिए रेगेक्स का उपयोग कर रहा हूं। – Jagd

16

यह करना चाहिए:

[^a-zA-Z0-9] 

मूल रूप से यह सभी गैर अक्षरांकीय अक्षर से मेल खाता है।

15

[^a-zA-Z0-9] एक चरित्र वर्ग किसी भी गैर अक्षरांकीय अक्षर से मेल खाता है।

वैकल्पिक रूप से, [^\w\d] वही काम करता है।

उपयोग:

string regExp = "[^\w\d]"; 
string tmp = Regex.Replace(n, regExp, ""); 
+2

मैंने इन दोनों संस्करणों का परीक्षण http://regexpal.com/ पर किया और पाया कि "[^ \ w \ d]" अंडरस्कोर वर्णों से मेल नहीं खाएगा जबकि [^ a-zA-Z0 -9] होगा। – Karle

3

"विशेष वर्ण" की अपनी परिभाषा के आधार पर, मुझे लगता है कि "[^ a-zA-Z0-9]" शायद चाल करना होगा। वह कुछ भी मिलेगा जो एक छोटा अक्षर, पूंजी पत्र या अंक नहीं है।

+0

ओह, मुझे जवाब में विकसित पैटर्न दिखाई देता है। – Jay

+4

पैटर्न नियमित है? – MikeD

2
tmp = Regex.Replace(n, @"\W+", ""); 

\w अक्षर, अंक, और अंडरस्कोर से मेल खाता है, \W नकार संस्करण है।

+0

चूंकि आप विशेष रूप से _ को परिभाषित करते हैं, आपको अन्य उत्तरों में से एक के साथ जाना चाहिए :) –

7

आप उपयोग कर सकते हैं:

string regExp = "\\W"; 

यह डैनियल "[^a-zA-Z0-9]"

\ डब्ल्यू किसी भी nonword चरित्र से मेल खाता है के बराबर है। यूनिकोड श्रेणियों के बराबर [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]

+3

_ से भी मेल खाता है, इसलिए यहां बिल्कुल सही नहीं है। –

+0

उम्मम, आप सही हैं - विवरण से ऐसा नहीं सोचा होगा। अच्छी तरह से देखा गया। –

2

मेरे उद्देश्यों के लिए मैं सभी अंग्रेजी ASCII वर्ण चाहता था, इसलिए यह काम किया।

html = Regex.Replace(html, "[^\x00-\x80]+", "") 
0

आप Regex का उपयोग नहीं करना चाहते हैं, तो एक और विकल्प

char.IsLetterOrDigit 

उपयोग करने के लिए आप स्ट्रिंग से प्रत्येक चार लूप करने के लिए इसका उपयोग कर सकते हैं और केवल वापसी बात लागू होगी।