2012-09-14 29 views
5

के साथ स्ट्रिंग में संख्या की जगह मैं क्या हासिल करने की कोशिश कर रहा हूँ गणना की (match * int) से एक नया मूल्यों के साथ स्ट्रिंग में संख्या को बदलने के लिए है।का पता लगाएं और रेगुलर एक्सप्रेशन से

तो स्ट्रिंग इनपुट की तरह दिखता है:

500g Flour 
14g Salt 
7g Dry yeast 
45ml Olive oil 
309ml Water 

और परिणाम इस तरह दिखना चाहिए:

1000g Flour 
28g Salt 
14g Dry yeast 
90ml Olive oil 
618 ml Water 

row["ingredients"] एक DataRow है।

यह वह जगह है जहां मैं यहां हूं:

System.Text.RegularExpressions. 
     Regex.Replace(row["ingredients"].ToString(), 
         @"[^/d]", Delegate(Match match) { return match * 2; }, 
         RegexOptions.Multiline); 

कोई समाधान बहुत सराहना कर रहा है।

+3

संभवतः एक मूर्ख सवाल है, लेकिन क्या कोई कारण है आप अन्य अवयवों के साथ नमक को दोगुना क्यों नहीं करते? – dash

+0

'500 ग्राम आटा 14 जी' बदलकर' 1000 ग्राम आटा 28 ग्राम नमक 'किया जाना चाहिए? यदि नहीं, तो मुझे लगता है कि सभी उत्तरों पर विचार किया जाना चाहिए। – hamed

+0

टाइपो, 28 जी नमक – James

उत्तर

4

पहली समस्या यह है कि आपका रेगेक्स केवल उन वर्णों से मेल खाता है जो अंक नहीं हैं।

सुधार: यह आगे उपयोग कर रहा है एक बैकस्लैश के बजाय स्लैश, तो यह कुछ भी है कि एक स्लेश या विज्ञापन

@"\b(\d+)"

यहाँ dotnetfiddle.net

पर एक काम उदाहरण है करने के लिए अपने regex बदले नहीं है मिलान है
using System; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var string1 = "500g Flour 14g Salt 7g Dry yeast 45ml Olive oil 309ml Water"; 

      var result = Regex.Replace(string1, @"\b(\d+)", Doubler, RegexOptions.Multiline); 

      Console.WriteLine(result); 

      Console.ReadKey(); 
     } 

     private static string Doubler(Match match) 
     { 
      return (Convert.ToInt32(match.Value)*2).ToString(); 
     } 
    } 
} 
+0

डाउनवोट क्यों? – CaffGeek

+0

मेरे द्वारा नहीं, लेकिन आपका रेगेक्स शाब्दिक स्ट्रिंग '/ w /' से मेल खाता है, इसके बाद एक या अधिक 'डी 'है। –

+0

@TimPietzcker, टाइपो, उनको बैकस्लाश होना चाहिए, निश्चित – CaffGeek

1

[^/d] का अर्थ है "स्लैश को छोड़कर कोई अक्षर या पत्र d"।

एक नंबर से मेल करने के लिए, \d+ का उपयोग करें।

0

डाटरो में विभिन्न प्रकार के डेटा को पकड़ना अच्छा अभ्यास नहीं है। अपने नमूने में: "500 ग्राम आटा" - यहां आपके पास घटक है, माप प्रकार, घटक नाम। मैं छोटी डेटा क्लास बनाने की अनुशंसा करता हूं जो इस पंक्ति का प्रतिनिधित्व करेगा, और सभी प्रकार के डेटा यह इस वर्ग के गुण होंगे।
लाभ अनजान हैं:
- विस्तार करने और संशोधित

सभी क्या आप regex के साथ की जरूरत है उपलब्ध कराए गए आंकड़ों पंक्ति का सही पार्सर बनाने के लिए है करने के लिए आसान - कोई regex जादू
साथ बदलने के लिए की जरूरत है। लेकिन निश्चित रूप से यह बदलने के साथ चालें और अधिक आसान है।

0
void Main() 
{ 
    string ingredients = 
@"500g Flour 
0.5g Salt 
7g Dry yeast 
45ml Olive oil 
309ml Water"; 

    string pattern = @"(?:[0-9]+\.?[0-9]*|\.[0-9]+)"; 

    int multiple = 2; 

    Regex.Replace(ingredients, pattern, m => (Convert.ToDecimal(m.Value)*multiple).ToString()).Dump(); 
} 

मैंने इसे LINQPad में किया है इसलिए डंप() के बारे में चिंता न करें जो परिणाम को आउटपुट करने के लिए है। और मैंने नमक को 0.5 में बदल दिया ताकि यह दिखाया जा सके कि यह गैर पूर्णांक के साथ काम करता है। यह पैटर्न सबसे अच्छा है जो मैं पूर्णांक और दशमलव (मिलान से पहले किसी भी संख्या के साथ या बिना) मिलान करने के लिए आ सकता हूं, इसलिए यह 17, 3.141592, या .5

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