2012-06-08 7 views
7

मैं नियमित अभिव्यक्तियों में एक विशेषज्ञ नहीं हूं और आज मेरी परियोजना में मुझे कई पंक्तियों में लंबी स्ट्रिंग को विभाजित करने की आवश्यकता का सामना करना पड़ता है ताकि यह जांच सके कि स्ट्रिंग टेक्स्ट पृष्ठ की ऊंचाई फिट बैठता है या नहीं।कई पंक्तियों में लंबे तारों को विभाजित करने के लिए नियमित अभिव्यक्ति

मुझे "\n", "\r\n" द्वारा कई पंक्तियों में लंबे तारों को विभाजित करने और अधिकतम पंक्तियों के अनुसार 150 वर्णों को रखने के लिए सी # नियमित अभिव्यक्ति की आवश्यकता है। यदि चरित्र 150 शब्द के मध्य में है, तो पूरा शब्द अगली पंक्ति में ले जाना चाहिए।

क्या कोई मेरी मदद कर सकता है?

+1

क्यों नियमित अभिव्यक्ति? यदि आप टैग सी # दिखाते हैं, तो इसे सी # फ़ंक्शंस के माध्यम से बनाएं। –

+0

तो क्या आप हर 150 वर्णों में प्रत्येक पंक्ति के लिए लाइनब्रैक डालना चाहते हैं? उदाहरण इनपुट और आउटपुट (एक छोटी सी सीमा के साथ) आप जो करना चाहते हैं उसे कल्पना करने में मदद कर सकते हैं। – Qtax

+0

बमर। शब्द तोड़ने का नियम दर्द है: आप एक शब्द को परिभाषित कैसे करते हैं (संभवतः आपके विचार से कहीं अधिक जटिल)? – Crisfole

उत्तर

0

ये रहा:

^.{1,150}\n 

यह इस तरह लंबे समय तक प्रारंभिक स्ट्रिंग से मेल खाएगी।

0

अगर आप सिर्फ उसके बाद 150 वर्ण की लाइनों में एक लंबी स्ट्रिंग विभाजित करने के लिए मुझे यकीन है कि तुम क्यों एक रेगुलर एक्सप्रेशन आवश्यकता होगी नहीं कर रहा हूँ चाहता हूँ:

private string stringSplitter(string inString) 
    { 
     int lineLength = 150; 

     StringBuilder sb = new StringBuilder(); 

     while (inString.Length > 0) 
     { 
      var curLength = inString.Length >= lineLength ? lineLength : inString.Length; 

      var lastGap = inString.Substring(0, curLength).LastIndexOfAny(new char[] {' ', '\n'}); 

      if (lastGap == -1) 
      { 
       sb.AppendLine(inString.Substring(0, curLength)); 
       inString = inString.Substring(curLength); 
      } 
      else 
      { 
       sb.AppendLine(inString.Substring(0, lastGap)); 
       inString = inString.Substring(lastGap + 1); 
      } 
     } 

     return sb.ToString(); 
    } 

शब्द के लिए खाते संपादित टूट जाता है

+0

समस्या यह है कि वह शब्द ब्रेक के बारे में परवाह करता है। –

+0

हाँ, मेरा बुरा .... – paul

1
var regex = new Regex(@".{0,150}", RegexOptions.Multiline); 
var strings = regex.Replace(sourceString, "$0\r\n"); 
+0

शब्द सीमाओं को सही तरीके से पकड़ नहीं लेता है। – MoonKnight

0

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

string line = "This is a really long run-on sentence that should go for longer than 150 characters and will need to be split into two lines, but only at a word boundary."; 

int maxLength = 150; 
string delimiter = "\r\n"; 

List<string> lines = new List<string>(); 
// As long as we still have more than 'maxLength' characters, keep splitting 
while (line.Length > maxLength) 
{ 
    // Starting at this character and going backwards, if the character 
    // is not part of a word or number, insert a newline here. 
    for (int charIndex = (maxLength); charIndex > 0; charIndex--) 
    { 
     if (char.IsWhiteSpace(line[charIndex])) 
     { 
      // Split the line after this character 
      // and continue on with the remainder 
      lines.Add(line.Substring(0, charIndex+1)); 
      line = line.Substring(charIndex+1); 
      break; 
     } 
    } 
} 
lines.Add(line); 
// Join the list back together with delimiter ("\r\n") between each line 
string final = string.Join(delimiter , lines); 

// Check the results 
Console.WriteLine(final); 

नोट: आप एक सांत्वना आवेदन में इस कोड को चलाते हैं, तो आप अपेक्षाकृत कम संख्या को "maxlength" बदलने के लिए इतना है कि कंसोल पर लपेट नहीं करता है सकते हैं।

नोट: यह कोड किसी भी टैब वर्ण को प्रभावी नहीं करता है। यदि टैब भी शामिल हैं, तो आपकी स्थिति थोड़ा और जटिल हो जाती है।

अद्यतन: मैंने एक बग तय की जहां नई लाइनें अंतरिक्ष के साथ शुरू हो रही थीं।

+0

एंड्रेस ज़ोलटन द्वारा वर्णित समाधान का दृष्टिकोण वह है जो मुझे चाहिए जो अधिक है। मुझे केवल एक चीज की आवश्यकता है, यह गारंटी देना है कि यदि char 150 शब्द के मध्य में है, तो पूरे शब्द (इस मामले के लिए मैं शब्दों को बिना रिक्त स्थान के अक्षरों का अनुक्रम मानता हूं) अगली पंक्ति में स्थानांतरित हो जाता है। – user1444433

7

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

.{0,150}(\s+|$) 

$0\r\n 

भी देखें बदलें: http://regexhero.net/tester/?id=75645133-1de2-4d8d-a29d-90fff8b2bab5

संबंधित मुद्दे

 संबंधित मुद्दे