2010-06-29 20 views
20

मैं अपरकेस से वाक्येंसस में पाठ की एक स्ट्रिंग को कन्वर्ट करने के लिए एक फ़ंक्शन ढूंढ रहा हूं। मेरे द्वारा देखे जाने वाले सभी उदाहरण टेक्स्ट को टाइटलकेज़ में बदल सकते हैं। एक सामान्य अर्थ मेंएक स्ट्रिंग को वाक्य केस में बदलने के लिए .NET विधि

वाक्य केस तरीका है कि पूंजीकरण एक वाक्य में प्रयोग किया जाता है वर्णन करता है। वाक्य मामले में भी एक अंग्रेजी वाक्य का मानक पूंजीकरण का वर्णन करता है, वाक्य के पहले अक्षर यानी बाकी जा रहा है छोटे अक्षर के साथ, अक्षर बड़ा है (जब तक कि एक विशिष्ट कारण के लिए पूंजीकरण की आवश्यकता होती है, जैसे व्यक्तिवाचक संज्ञाओं, संक्षिप्त, आदि।)।

क्या कोई मुझे वाक्य के लिए किसी स्क्रिप्ट या फ़ंक्शन की दिशा में इंगित कर सकता है?

+0

स्ट्रिंग एक वाक्य, या कई वाक्य है? – Jay

+1

http://stackoverflow.com/questions/2135863/formatting-sentences-in-a-string-using-c – SwDevMan81

उत्तर

28

.NET में कुछ भी नहीं बनाया गया है - हालांकि, यह उन मामलों में से एक है जहां नियमित अभिव्यक्ति प्रसंस्करण वास्तव में अच्छी तरह से काम कर सकती है। मैं पहली स्ट्रिंग को कम मामले में परिवर्तित करके शुरू करूंगा, और फिर, पहले अनुमान के रूप में, आप [a-z]\.\s+(.) जैसे सभी अनुक्रमों को खोजने के लिए रेगेक्स का उपयोग कर सकते हैं, और कैप्चर किए गए समूह को ऊपरी मामले में बदलने के लिए ToUpper() का उपयोग कर सकते हैं। RegEx वर्ग में Replace() विधि अधिभारित है जो MatchEvaluator प्रतिनिधि को स्वीकार करता है, जो आपको मिलान किए गए मान को प्रतिस्थापित करने के तरीके को परिभाषित करने की अनुमति देता है।

यहाँ काम पर इस का एक कोड उदाहरण है:

var sourcestring = "THIS IS A GROUP. OF CAPITALIZED. LETTERS."; 
// start by converting entire string to lower case 
var lowerCase = sourcestring.ToLower(); 
// matches the first sentence of a string, as well as subsequent sentences 
var r = new Regex(@"(^[a-z])|\.\s+(.)", RegexOptions.ExplicitCapture); 
// MatchEvaluator delegate defines replacement of setence starts to uppercase 
var result = r.Replace(lowerCase, s => s.Value.ToUpper()); 

// result is: "This is a group. Of uncapitalized. Letters." 

यह अलग अलग तरीकों की एक संख्या में परिष्कृत किया जा सकता बेहतर वाक्य पैटर्न का एक व्यापक विविधता मैच के लिए (न केवल एक पत्र + अवधि में समाप्त होने वाले उन) ।

+0

मैंने इसमें से एक विस्तार विधि बनाई है और विकल्प बदलने से पहले स्ट्रिंग को वैकल्पिक रूप से कम करने के लिए वैकल्पिक बूलियन वैरिएबल जोड़ा है स्ट्रिंग। इससे नीचे जय के जवाब में तारों के साथ मदद मिलेगी। समझा जा सकता है, यह ऐसा कुछ है जिसे मैं शायद ही कभी उपयोग करता हूं, लेकिन मैं इसे किसी बिंदु पर काम में देख सकता था। – krillgar

4

यह मेरे लिए काम करता है।

/// <summary> 
/// Converts a string to sentence case. 
/// </summary> 
/// <param name="input">The string to convert.</param> 
/// <returns>A string</returns> 
public static string SentenceCase(string input) 
{ 
    if (input.Length < 1) 
     return input; 

    string sentence = input.ToLower(); 
    return sentence[0].ToString().ToUpper() + 
     sentence.Substring(1); 
} 
+1

यदि इनपुट एकाधिक वाक्यों हैं तो आपको डॉटिमीटर के रूप में डॉट का उपयोग करके प्रत्येक वाक्य को विभाजित करने की भी आवश्यकता होगी। – RvdK

+0

या कोई अन्य वैध विराम चिह्न – SwDevMan81

+2

"डिलिमीटर के रूप में डॉट" वास्तव में इसे काट नहीं देता है। 'श्री और श्रीमती स्मिथ के पास $ 1,000.00 प्रत्येक है; वे मैग्नोलिया Blvd पर रहते हैं। नीले घर में। – Jay

2

मुझे यह sample on MSDN मिला।

+0

यह स्ट्रिंग को वाक्य केस में परिवर्तित करने का एक बहुत ही जटिल तरीका प्रतीत होता है। मुझे लगता है कि व्यक्तिगत रूप से नियमित अभिव्यक्तियों के लिए यह एक बेहतर समस्या है। – LBushkin

2

यदि आपकी इनपुट स्ट्रिंग वाक्य नहीं है, लेकिन कई वाक्यों में, यह एक बहुत ही मुश्किल समस्या बन जाती है।

नियमित अभिव्यक्तियां एक अमूल्य उपकरण साबित होंगी, लेकिन (1) आपको उन्हें प्रभावी होने के लिए बहुत अच्छी तरह से जानना होगा, और (2) वे पूरी तरह से नौकरी करने के लिए तैयार नहीं हो सकते हैं।

इस वाक्य

पर विचार करें "कौन 1 पर है," श्री स्मिथ - जो हँस नहीं किया गया था - उत्तर दिया।

यह वाक्य एक पत्र से शुरू नहीं होता है, इसमें एक अंक, विभिन्न विराम चिह्न, उचित नाम और . मध्य में है।

जटिलताएं बहुत बड़ी हैं, और यह एक वाक्य है।

RegEx का उपयोग करते समय सबसे महत्वपूर्ण चीजों में से एक है "अपना डेटा जानें।" यदि आप वाक्यों के प्रकारों की चौड़ाई जानते हैं जिनके साथ आप काम करेंगे, तो आपका कार्य अधिक प्रबंधनीय होगा।

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

1

यही वह है जो मैं उपयोग करता हूं (वीबीएनईटी)। यह सबसे स्थितियों, सहित में काम करता है:

  • कई वाक्य
  • वाक्य शुरुआत और रिक्त स्थान के साथ समाप्त
  • को A से Z के अलावा अन्य पात्रों के साथ शुरुआत वाक्य। उदाहरण के लिए यह काम करेगा: "अगर आप $ 100.00 चाहते हैं तो बस मुझसे पूछें"।

    <Extension()> 
    Public Function ToSentanceCase(ByVal s As String) As String 
        ' Written by Jason. Inspired from: http://www.access-programmers.co.uk/forums/showthread.php?t=147680 
    
        Dim SplitSentence() As String = s.Split(".") 
    
        For i = 0 To SplitSentence.Count - 1 
         Dim st = SplitSentence(i) 
    
         If st.Trim = "" Or st.Trim.Count = 1 Then Continue For ' ignore empty sentences or sentences with only 1 character. 
    
         ' skip past characters that are not A-Z, 0-9 (ASCII) at start of sentence. 
         Dim y As Integer = 1 
         Do Until y > st.Count 
          If (Asc(Mid(st, y, 1)) >= 65 And Asc(Mid(st, y, 1)) <= 90) Or _ 
            (Asc(Mid(st, y, 1)) >= 97 And Asc(Mid(st, y, 1)) <= 122) Or _ 
           (Asc(Mid(st, y, 1)) >= 48 And Asc(Mid(st, y, 1)) <= 57) Then 
           GoTo Process 
          Else 
           Dim w = Asc(Mid(st, y, 1)) 
           y += 1 
          End If 
         Loop 
         Continue For 
    
    Process: 
         Dim sStart As String = "" 
         If y > 1 Then sStart = Left(st, 0 + (y - 1)) 
    
         Dim sMid As String = UCase(st(y - 1)) ' capitalise the first non-space character in sentence. 
    
         Dim sEnd As String = Mid(st, y + 1, st.Length) 
    
         SplitSentence(i) = sStart & sMid & sEnd 
    
        Next 
    
        ' rejoin sentances back together: 
        Dim concat As String = "" 
        For Each st As String In SplitSentence 
         concat &= st & "." 
        Next 
    
        concat = concat.TrimEnd(1) 
    
        Return concat 
    
    End Function 
    

लेकिन व्यक्तिवाचक संज्ञाओं और संक्षिप्त रूप के लिए के रूप में, ठीक है ... वहाँ हमेशा अंग्रेजी भाषा में स्थितियों होने के लिए जहां विराम चिह्न के रूप में सरल नहीं है जा रहे हैं। उदाहरण के लिए इस स्क्रिप्ट को इलिप्सिस ("..."), या संक्षेपों का पता नहीं लगाया जाएगा (उदाहरण: "श्री जोन्स क्रिस हाउस के पास मैग्नोलिया Blvd. पर रहते थे")।

पूरी तरह से समस्या का समाधान करने के लिए आपको भाषा के लिए सभी संभावित संक्षेप/विराम चिह्नों का एक शब्दकोश तैयार करना होगा, और शब्दकोश को अद्यतित रखना होगा! इस पर विचार करने के बाद ज्यादातर समझौता से खुश होंगे, अन्यथा केवल माइक्रोसॉफ्ट वर्ड का उपयोग करें।

2

आप वाक्य केस में एक स्ट्रिंग बस अवधि की तुलना में अन्य विराम युक्त करना चाहते हैं:

string input = "THIS IS YELLING! WHY ARE WE YELLING? BECAUSE WE CAN. THAT IS ALL."; 
var sentenceRegex = new Regex(@"(^[a-z])|[?!.:,;]\s+(.)", RegexOptions.ExplicitCapture); 
input = sentenceRegex.Replace(input.ToLower(), s => s.Value.ToUpper()); 
-1
public string GetSentenceCase(string ReqdString) { 
    string StrInSentCase = ""; 
    for (int j = 0; j < ReqdString.Length; j++) { 
     if (j == 0) { 
      StrInSentCase = ReqdString.ToString().Substring(j, 1).ToUpper(); 
     } 
     else { 
      StrInSentCase = StrInSentCase + ReqdString.ToString().Substring(j, 1).ToLower(); 
     } 
    } 
    return StrInSentCase.ToString(); 
} 
संबंधित मुद्दे