2008-10-28 17 views
5

मुझे चार वाक्यों के समूहों में "एक। दो। तीन। चार। पांच छः सात। आठ। नौ। दस। ग्यारह" जैसे स्ट्रिंग से मिलान करने की आवश्यकता है। मुझे प्रत्येक चौथी अवधि के बाद समूह में स्ट्रिंग को तोड़ने के लिए नियमित अभिव्यक्ति की आवश्यकता होती है। की तरह कुछ: क्योंकि यह न सिर्फ समय के लिए खुद को समय के पहले पाठ का स्थान ले लेगानियमित अभिव्यक्ति का उपयोग करके वाक्यों में स्प्लिट स्ट्रिंग

string regex = @"(.*.\s){4}"; 

    System.Text.RegularExpressions.Regex exp = new System.Text.RegularExpressions.Regex(regex); 

    string result = exp.Replace(toTest, ".\n"); 

काम नहीं करता। मैं केवल अवधि को कैसे गिन सकता हूं और उन्हें एक अवधि और नए रेखा चरित्र के साथ बदल सकता हूं?

उत्तर

1

विधि

private string AppendNewLineToMatch(Match match) { 
    return match.Value + Environment.NewLine; 
} 

को परिभाषित करने और

string result = exp.Replace(toTest, AppendNewLineToMatch); 

इस का उपयोग करते हुए प्रत्येक मैच के लिए विधि कॉल करना चाहिए, और उस विधि के परिणाम के साथ बदलने की कोशिश करें। विधि का परिणाम मेल खाने वाला टेक्स्ट और एक नई लाइन होगी।


संपादित करें: इसके अलावा, मैं ओलिवर से सहमत हूं। सही regex परिभाषा होनी चाहिए:

string regex = @"([^.]*[.]\s*){4}"; 

एक और संपादित करें: रेगुलर एक्सप्रेशन फिक्स्ड, उम्मीद है कि मैं यह सही इस बार मिला है।

+0

@ "[^।] * [।] \ * {4} रहा है" अभिव्यक्ति एक नेस्टेड परिमाणक त्रुटि देता है। अभिव्यक्ति @ "([^।] * [।]) {4} \ s *"; (जेम्स Curran से) परिणाम: एक। दो। तीन। चार। एक। दो। तीन। चार। नौ। दस। ग्यारह –

2

"किसी भी चरित्र"

तो अपने regex में

एक regex साधन में ., आप .*. का इस्तेमाल किया है जो एक शब्द के अनुरूप होगा (इस .+ के बराबर है)

आप शायद [^.]\*[.] देख रहे थे - एक वर्णों की श्रृंखला जो "." नहीं हैं, उसके बाद "." है।

0

खोजें अभिव्यक्ति: @"(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)" बदलें अभिव्यक्ति: "$1 $2 $3 $4.\n"

मेरे द्वारा चुने गए नेट regex के साथ RegexBuddy में इस अभिव्यक्ति भाग गया है, और उत्पादन है:

one two three four. 
five six seven eight. 
nine. ten. eleven 

मैं का एक @"(?:([^.]+?).\s){4}" प्रकार के साथ करने की कोशिश की व्यवस्था, लेकिन कब्जा केवल अंतिम घटना (यानी शब्द) पर कब्जा करेगा, इसलिए जब इसे बदलने की बात आती है, तो आप 4 में से तीन शब्द खो देंगे। अगर कोई गलत है तो कृपया मुझे सही करें।

+0

मूल स्ट्रिंग के परिणामस्वरूप (एक पंक्ति को दिखाने के लिए ब्रैकेट [एक दो तीन।] [चार पांच छः सात।] [आठ नौ नौ दस ग्यारह]। इसे एक स्ट्रिंग पर चलाना जैसे: "एक। दो। तीन। चार। पांच छः सात। आठ। नौ। दस। ग्यारह "परिणामस्वरूप [एक दो था।] [चार फीव छः।] –

0

क्या आपको इसे रेगेक्स के माध्यम से करने के लिए मजबूर किया गया है? स्ट्रिंग को विभाजित करना आसान नहीं होगा, फिर सरणी को संसाधित करना आसान होगा?

-1

इस मामले में ऐसा लगता है कि रेगेक्स ओवरकिल का थोड़ा सा है। मैं String.split का उपयोग करने और फिर स्ट्रिंग के परिणामी सरणी को तोड़ने की अनुशंसा करता हूं। रेगेक्स बनाने की कोशिश करने से आप इसे जितना करने की कोशिश कर रहे हैं उससे कहीं अधिक सरल और कहीं अधिक विश्वसनीय होना चाहिए।

ऐसा कुछ पढ़ने और डीबग करने के लिए थोड़ा आसान हो सकता है।

String s = "one. two. three. four. five. six. seven. eight. nine. ten. eleven" 
String[] splitString = s.split(".") 
List li = new ArrayList(splitString.length/2) 
for(int i=0;i<splitString.length;i+=4) { 
    st = splitString[i]+"." 
    st += splitString[i+1]+"." 
    st += splitString[i+2]+"." 
    st += splitString[i+3]+"." 
    li.add(st) 
} 
0

मुझे यकीन नहीं है कि कॉन्फ़िगरेटर का जवाब संपादक द्वारा क्या उलझा हुआ है या क्या, लेकिन यह काम नहीं करता है। सही पैटर्न है

string regex = @"([^.]*[.]){4}\s*"; 
संबंधित मुद्दे