2012-03-07 15 views
6

मुझे एक स्ट्रिंग के कुछ हिस्सों को एक दूसरे के साथ सी # का उपयोग करने की आवश्यकता है। मुझे इस here को प्राप्त करने के तरीके के बारे में केवल एक ही प्रश्न मिल सकता है लेकिन यह PHP था।एक दूसरे के साथ दो या दो से अधिक तारों को कैसे प्रतिस्थापित करें?

मेरे स्थिति एक शब्दकोश [स्ट्रिंग, स्ट्रिंग] जो की तरह बदलने के लिए जोड़े रखती है शामिल है:

  • कुत्ते, बिल्ली
  • बिल्ली, माउस,
  • माउस, रैप्टर

और मेरे पास मूल्य के साथ एक स्ट्रिंग है:

"My dog ate a cat which once ate a mouse got eaten by a raptor" 

मैं एक समारोह की जरूरत है इसे पाने के लिए: यदि मैं शब्दकोश की गणना

"My cat ate a mouse which once ate a raptor got eaten by a raptor" 

और आदेश से string.Replace कहते हैं, मैं इस मिल:

"My raptor ate a raptor which once ate a raptor got eaten by a raptor" 

यह अजीब है कि अगर यह पहले से पूछा नहीं किया गया है , (क्या यह सामान्य ज्ञान है?) लेकिन मुझे कोई नहीं मिला। तो मुझे खेद है अगर यह है और मैं इसे याद किया।

+0

ऐसा करने का एक गंदा तरीका कुछ मध्यवर्ती पाठ का उपयोग करना होगा। तो, 'कुत्ते' से '1', 'बिल्ली' से '2' में परिवर्तित करें, और उसके बाद दूसरा पास करें जहां आप '1' और '2' को जो भी चाहते हैं उसे रूपांतरित करें। '1' और '2' (शायद एक GUID) से अधिक अद्वितीय कुछ का उपयोग करना सुनिश्चित करें। जैसे मैंने कहा, यह गंदा है, और मुझे यकीन है कि एक बेहतर तरीका है। – xbonez

+0

एक शब्दकोश {"foo": "1", "bar": "2", "foobar": "3"}, और इनपुट "foo bar foobarbar" के लिए आप क्या चाहते हैं (आउटपुट के रूप में)? – Dogbert

+0

@ डोगबर्ट "1 2 32" –

उत्तर

9

तो आपको मिलान प्रक्रिया के लिए केवल एक बार होने की आवश्यकता है। एक बार मुझे लगता है कि सही जवाब वास्तव में 'regex का उपयोग करें' है!

var replacements = new Dictionary<string, string> 
         { 
          { "do|g", "cat" }, 
          { "ca^t", "mouse" }, 
          { "mo$$use", "raptor" } 
         }; 

var source = "My do|g ate a ca^t which once ate a mo$$use"; 

var regexPattern = 
    "(" + 
    string.Join("|", replacements.Keys.Select(Regex.Escape)) + 
    ")"; 

var regex = new Regex(regexPattern); 

var result = regex.Replace(source, match => replacements[match.Value]); 

// Now result == "My cat ate a mouse which once ate a raptor" 

पैटर्न हम यहाँ निर्माण (dog|cat|mouse) की तरह दिखता है: यहाँ कुछ कोड है। इस विकल्प में प्रत्येक टुकड़ा (|)Regex.Escape के माध्यम से पारित किया गया है, ताकि कुंजी में regex- अर्थपूर्ण अक्षर (जैसे |, ^, आदि) समस्याएं नहीं पैदा करते हैं। जब कोई मिलान मिलता है, तो मिलान टेक्स्ट को शब्दकोश में इसी मान से बदल दिया जाता है। स्ट्रिंग केवल एक बार स्कैन की जाती है, इसलिए पुनरावृत्ति string.Replace के साथ समस्या के रूप में कोई दोहराया मिलान नहीं है।

+0

मेरे समाधान से बेहतर और अधिक सुरुचिपूर्ण। मुझसे +1 –

+1

आपके उत्तर के लिए धन्यवाद। यह वास्तव में सुरुचिपूर्ण है लेकिन चूंकि मुझे रेगेक्स के साथ अनुभव नहीं है; मुझे पूछना है: क्या होगा यदि मैं कुत्ते को सीएटी के साथ बदलने की कोशिश कर रहा था? क्या उन हिस्सों को बेअसर करने का कोई तरीका है जिन्हें मैं प्रतिस्थापित करना चाहता हूं (बैकस्लेश और "|" कैरेक्टर) और '(कुत्ता | सीए | टी | माउस)' जैसे कुछ बनाने से बचें? –

+0

@ d4wn उत्कृष्ट विचार। आवश्यकतानुसार 'Regex.Escape' के उपयोग में संपादित किया है। – AakashM

1

आप जो चाहते हैं वह सभी स्ट्रिंग-प्रतिस्थापन एक साथ प्रदर्शन करना है, ताकि आपको एक ही टोकन पर कई प्रतिस्थापन न मिलें, है ना?

मैं दो दृष्टिकोण, न तो विशेष रूप सुरुचिपूर्ण के बारे में सोच सकते हैं: अपने शब्दकोश विशेष क्रम में अधिक

  • दोहराएं, ताकि आप हमेशा से पहले बिल्ली/माउस माउस/रैप्टर से बदल देंगे।
  • 'माउस' के साथ बिल्ली को बदलने के बजाय, इसे '$ माउस $' या एक समान मार्कर के साथ बदलें। इससे यह सुनिश्चित होगा कि '$ माउस $' को 'रैप्टर' (या, वास्तव में, '$ raptor $') से प्रतिस्थापित नहीं किया गया है। फिर, एक बार जब आप अपने स्विच समाप्त कर लेंगे, तो आप सभी '$' संकेतों को हटा सकते हैं।
+0

बिंदु के लिए आपको प्रश्नों के विपरीत क्रम में माउस,> रैप्टर फिर बिल्ली -> माउस तो कुत्ते -> बिल्ली को प्रतिस्थापित करने की आवश्यकता होगी। – TheLukeMcCarthy

+0

इस विशिष्ट नमूने में, हाँ। अधिक सामान्य समाधान के लिए, आपको सुनिश्चित करने के लिए कुछ प्रकार के निर्देशित एक्रिलिक ग्राफ़ बनाने की आवश्यकता होगी। –

+0

यह सही है कि मैं सिर्फ एक ठोस उदाहरण देना चाहता था इसलिए d4wn देख सकता था कि यह पहले क्यों काम नहीं करता था। – TheLukeMcCarthy

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