2013-05-24 9 views
18

टेक्स्ट को शब्दों में कैसे विभाजित करें?टेक्स्ट को शब्दों में कैसे विभाजित करें?

उदाहरण पाठ:

'ओह, आपको लगता है कि मदद नहीं कर सकता,' बिल्ली ने कहा: 'हम यहाँ सब पागल हो रहे हैं। मैं पागल हूँ। आप पागल हैं।'

कि लाइन में शब्द हैं:

  1. ओह
  2. आप
  3. कर सकते हैं
  4. कहा नहीं
  5. मदद
  6. कि
  7. बिल्ली
  8. हम
  9. सभी
  10. पागल
  11. यहाँ
  12. मैं
  13. पागल
  14. हूँ आप
  15. पागल
+4

मेरी सलाह: एक स्पष्ट शाब्दिक व्याकरण को परिभाषित करने से शुरू है और फिर उस व्याकरण कि टोकन के एक अनुक्रम का उत्पादन के लिए एक lexer लिखें। फिर उन टोकन को अस्वीकार करें जो "शब्द" उत्पादन में शामिल नहीं हैं। यह नियमित अभिव्यक्तियों के लिए नौकरी नहीं है। –

+0

मुझे वास्तव में एरिक की प्रतिक्रिया पसंद है। मुझे पता है कि मैं पार्टी के लिए थोड़ा देर हो चुकी हूं, लेकिन यह जाने का सबसे अच्छा तरीका है। –

+0

मैंने उपरोक्त सभी ** डेलीमीटर ** एकत्र किए हैं और मुझे इस परिणाम की तरह कुछ मिला है। स्प्लिट ({"'", "", ",'", ": '", "।", "।'"} , StringSplitOptions.RemoveEmptyEntries); –

उत्तर

31

व्हाइटस्पेस पर टेक्स्ट स्प्लिट करें, फिर विराम चिह्न को ट्रिम करें।

var text = "'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'"; 
var punctuation = text.Where(Char.IsPunctuation).Distinct().ToArray(); 
var words = text.Split().Select(x => x.Trim(punctuation)); 

बिल्कुल उदाहरण के साथ सहमत हैं।

21

पहले कर रहे हैं, सभी निकालें विशेष characeters:

var fixedInput = Regex.Replace(input, "[^a-zA-Z0-9% ._]", string.Empty); 
// This regex doesn't support apostrophe so the extension method is better 

तो यह विभाजित:

var splitted = fixedInput.Split(' '); 

विशेष वर्ण को हटाने (जिन्हें आप आसानी से बदल सकते हैं) के लिए एक सरल सी # समाधान के लिए, इस विस्तार विधि (मैं एपोस्ट्रोफ़ी के लिए एक समर्थन जोड़ा) जोड़ें:

public static string RemoveSpecialCharacters(this string str) { 
    StringBuilder sb = new StringBuilder(); 
    foreach (char c in str) { 
     if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '\'') { 
     sb.Append(c); 
     } 
    } 
    return sb.ToString(); 
} 

तब तो की तरह उपयोग:

var words = input.RemoveSpecialCharacters().Split(' '); 

आप surpr हो जाएगा ised पता चला है कि इस विस्तार विधि (निश्चित रूप से और अधिक कुशल तो Regex) बहुत ही कुशल है तो मैं आप इसका इस्तेमाल का सुझाव देंगे;)

अद्यतन

मैं मानता हूँ कि यह एक अंग्रेजी केवल दृष्टिकोण है, लेकिन यह यूनिकोड संगत तुम सब करने की है की जगह है बनाने के लिए:

(c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') 

के साथ:

char.IsLetter(c) 

कौन सा suppor टी यूनिकोड,।नेट इसके अलावा मामलों

+0

मुझे नहीं लगता कि अंक एक शब्द का हिस्सा हैं - लेकिन मुझे लगता है कि ओपी – Hogan

+0

पर निर्भर है, मुझे लगता है कि यह उनके ऊपर है, वह रेगेक्स को अपनी इच्छानुसार बदल सकता है। –

+2

एकमात्र मुद्दा जो मैं देखता हूं वह है कि आपका समाधान एस्ट्रोफ़े को संकुचन से दूर कर देगा। पूर्व। बदलना "नहीं है" –

6

बस @Adam Fridental के जवाब पर एक बदलाव जो बहुत अच्छा है जोड़ने के लिए की विविधता के लिए आप char.IsSymbol और char.IsLetterOrDigit प्रदान करता है, तो आप इस Regex की कोशिश कर सकते:

var text = "'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'"; 

var matches = Regex.Matches(text, @"\w+[^\s]*\w+|\w"); 

foreach (Match match in matches) { 
    var word = match.Value; 
} 

मेरा मानना ​​है कि यह कम से कम है रेगुलर एक्सप्रेशन से कि सभी शब्दों की

\w+[^\s]*\w+|\w 
+1

अच्छा।लेकिन जैसा कि मैंने अपने उत्तर में कहा है कि एक चीज है जो इसे रेगेक्स के साथ हल करते समय समस्याग्रस्त है - जो समय लगता है, मैंने जांच की है और मेरे उत्तर में मैंने जो एक्सटेंशन विधि लिखी है वह ~ एक्स 7 तेज है, फिर नियमित अभिव्यक्ति पार्सिंग है। –

+1

उन्हें प्रोफाइल करने के लिए धन्यवाद, मैंने आज कुछ नया सीखा :) :) मेरा अपवित्र है। मैं कोड जटिलता को कम करने के लिए रेगेक्स के लिए बहस (जैसा कि मेरी प्रकृति है) रखता हूं, लेकिन आपकी विधि बहुत कम है और अधिकांश लोगों को रेगेक्स को दोस्ताना नहीं लगता है। ओह अच्छा। –

+1

मैं मानता हूं कि रेफेक्स बहुत अच्छा है। जब आपके पास प्रतीक्षा करने के लिए दूसरा होता है :) –

0

मिल जाएगा आप कर सकते थे एक regex का उपयोग कर एपॉस्ट्रोफ़ी कि पत्र (यानी एकल उद्धरण) और फिर Char स्थिर तरीकों का उपयोग कर से घिरा नहीं कर रहे हैं दूर करने के लिए सभी OT पट्टी करने की कोशिश उसके पात्र पहले रेगेक्स को कॉल करके आप संकुचन एस्ट्रोफ़ेस (उदा। can't) रख सकते हैं लेकिन 'Oh जैसे सिंगल कोट्स को हटा सकते हैं।

string myText = "'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'"; 

Regex reg = new Regex("\b[\"']\b"); 
myText = reg.Replace(myText, ""); 

string[] listOfWords = RemoveCharacters(myText); 

public string[] RemoveCharacters(string input) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (char c in input) 
    { 
     if (Char.IsLetter(c) || Char.IsWhiteSpace(c) || c == '\'') 
      sb.Append(c); 
    } 

    return sb.ToString().Split(' '); 
} 
1

आप एक Regex वस्तु का उपयोग नहीं करना चाहते हैं, आप की तरह कुछ कर सकता है ...

string mystring="Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad."; 
List<string> words=mystring.Replace(",","").Replace(":","").Replace(".","").Split(" ").ToList(); 

तुम अब भी "के अंत में पीछे apostrophe संभाल करना होगा कि , ''

1

यह समाधान में से एक है, मैं किसी भी सहायक वर्ग या विधि का उपयोग नहीं करता हूं।

 public static List<string> ExtractChars(string inputString) { 
      var result = new List<string>(); 
      int startIndex = -1; 
      for (int i = 0; i < inputString.Length; i++) { 
       var character = inputString[i]; 
       if ((character >= 'a' && character <= 'z') || 
        (character >= 'A' && character <= 'Z')) { 
        if (startIndex == -1) { 
         startIndex = i; 
        } 
        if (i == inputString.Length - 1) { 
         result.Add(GetString(inputString, startIndex, i)); 
        } 
        continue; 
       } 
       if (startIndex != -1) { 
        result.Add(GetString(inputString, startIndex, i - 1)); 
        startIndex = -1; 
       } 
      } 
      return result; 
     } 

     public static string GetString(string inputString, int startIndex, int endIndex) { 
      string result = ""; 
      for (int i = startIndex; i <= endIndex; i++) { 
       result += inputString[i]; 
      } 
      return result; 
     } 
संबंधित मुद्दे