2011-09-05 16 views
8

में विराम चिह्नों में समस्या होने पर मैंने कुछ समान प्रश्न देखे हैं लेकिन मैं इसे प्राप्त करने की कोशिश कर रहा हूं।शब्दों में वाक्य को विभाजित करें लेकिन सी #

एक स्ट्रिंग को देखते हुए, str = "चंद्रमा हमारा प्राकृतिक उपग्रह है, यानी यह पृथ्वी के चारों ओर घूमता है!" मैं शब्दों को निकालना चाहता हूं और उन्हें एक सरणी में स्टोर करना चाहता हूं। अपेक्षित सरणी तत्व यह होंगे।

the 
moon 
is 
our 
natural 
satellite 
i.e. 
it 
rotates 
around 
the 
earth 

मैंने String.split (',' \ t ',' \ r ') का उपयोग करने की कोशिश की लेकिन यह सही ढंग से काम नहीं करता है। मैंने। और अन्य विराम चिह्नों को हटाने का भी प्रयास किया लेकिन मुझे एक स्ट्रिंग चाहिए जैसे "i.e." भी बाहर निकाला जा सकता है। इस लक्ष्य को हासिल करने का सबसे अच्छा तरीका क्या है? मैंने regex.split का उपयोग करने का कोई फायदा नहीं लिया।

string[] words = Regex.Split(line, @"\W+"); 

निश्चित रूप से सही दिशा में कुछ nudges की सराहना करेंगे।

+0

'i.e.' और विराम चिह्न 'में दूसरा' .' अलग-अलग नहीं है जब तक आप' .' में समाप्त होने वाले शब्दों की एक सूची नहीं जोड़ते। – CodesInChaos

+12

मुझे लगता है कि चंद्रमा * अपने अक्ष के चारों ओर घूमता है। यह * पृथ्वी के चारों ओर घूमता है। –

उत्तर

26

एक regex समाधान को हटाने।

(\b[^\s]+\b) 

और आप इस इस्तेमाल कर सकते हैं आप वास्तव मेंi.e. पर है कि पिछले . ठीक करने के लिए चाहते हैं।

((\b[^\s]+\b)((?<=\.\w).)?) 

यहां कोड का उपयोग कर रहा हूं।

var input = "The moon is our natural satellite, i.e. it rotates around the Earth!"; 
    var matches = Regex.Matches(input, @"((\b[^\s]+\b)((?<=\.\w).)?)"); 

    foreach(var match in matches) 
    { 
    Console.WriteLine(match); 
    } 

परिणाम:

The 
moon 
is 
our 
natural 
satellite 
i.e. 
it 
rotates 
around 
the 
Earth 
+0

लेकिन क्या यह शब्द के हिस्से के रूप में विराम चिह्न शामिल नहीं है? तो अंतिम शब्द के ऊपर उदाहरण में "पृथ्वी!" ... –

+0

नहीं, यह पृथ्वी में विराम चिह्न से मेल नहीं खाएगा। शब्द सीमाओं पर \ \' मैच। – TheCodeKing

+0

@Thecodeking, "i.e." से मेल खाने के बारे में क्या? या "u.n.i.c.e.f" जैसे कुछ? –

2

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

var str="The moon is our natural satellite, i.e. it rotates around the Earth!"; 
var a = str.Split(new char[] {' ', '\t'}); 
for (int i=0; i < a.Length; i++) 
{ 
    Console.WriteLine(" -{0}", a[i]); 
} 

परिणाम:

-The 
-moon 
-is 
-our 
-natural 
-satellite, 
-i.e. 
-it 
-rotates 
-around 
-the 
-Earth! 

आप, परिणाम के कुछ पोस्ट-प्रोसेसिंग कर सकता है के लिए अल्पविराम और अर्द्धविराम, आदि

+0

क्या यह सबसे अच्छा समाधान होगा। पोस्ट प्रोसेसिंग इन मामलों के मामलों के लिए अक्षम माना जाएगा? –

8

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

अनुमति के एक शब्दकोश को जोड़ने पर विचार करें "शब्द जिनमें विराम चिह्न होता है।" यह आपकी समस्या को हल करने का सबसे आसान तरीका हो सकता है।

+0

रेगेक्स इसे '\ b' के साथ करता है, इसलिए आपको कुछ ग्रे क्षेत्र नहीं माना जाता है। उदाहरण के लिए 'i.e'' मिलान के साथ 'i.e'। – TheCodeKing

1
Regex.Matches(input, @"\b\w+\b").OfType<Match>().Select(m => m.Value) 
संबंधित मुद्दे