2010-03-27 13 views
7

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

x[0] = x[1] & x[1] = x[2] 

मैं एक पुन: स्वरूपित संस्करण के साथ प्रत्येक उदाहरण बदलना चाहते हैं:

x__0 = x__1 & x__1 = x__2 

लाइन वर्ग कोष्ठक कहीं और शामिल हो सकते हैं

मैं एक रेखा है।

मैं एक regex कि सरणी उपयोग से मिलान करेगा मिल गया है:

array_usage = /(\w+)\[(\d+)\]/ 

लेकिन मैं समझ नहीं रूबी प्रत्येक उदाहरण के एक के बाद एक को बदलने के लिए का निर्माण। मैं .gsub() का उपयोग नहीं कर सकता क्योंकि यह लाइन पर हर उदाहरण से मेल खाएगा, और प्रत्येक सरणी घोषणा को पहले जो कुछ भी था, उसे प्रतिस्थापित करेगा। .scan() शिकायत करता है कि यदि आप किसी ब्लॉक के अंदर .sub()! के साथ स्कैन करने का प्रयास करते हैं और स्कैन का उपयोग करते हैं तो स्ट्रिंग को संशोधित किया जा रहा है।

किसी भी विचार की सराहना की जाएगी!

उत्तर

18

Actaully आप gsub उपयोग कर सकते हैं, तो आप सिर्फ इसे सही ढंग से उपयोग करने के लिए सावधान रहना होगा:

s = 'x[0] = x[1] & x[1] = x[2]' 
s.gsub!(/(\w+)\[(\d+)\]/, '\1__\2') 
puts s 

परिणाम:

x__0 = x__1 & x__1 = x__2 
+0

ओह, जादू, धन्यवाद। यह मेरे लिए काम नहीं कर रहा था क्योंकि मैंने डबल-कोट्स में '\ 1 __ \ 2' लपेट लिया था, "एकल नहीं"। मैं जाऊंगा और पढ़ूंगा क्यों रूबी अलग-अलग व्यवहार करता है। धन्यवाद मार्क! – cflewis

+3

@Lewisham: जब आप डबल-कोट्स का उपयोग करते हैं तो "\ 1" को ASCII वर्ण 1 के लिए एस्केप कोड के रूप में व्याख्या किया जाता है। जब आप सिंगल कोट्स का उपयोग करते हैं, तो स्ट्रिंग को सचमुच बैकस्लैश के रूप में व्याख्या किया जाता है, जिसके बाद 1 जीएसबी पहचानता है। –

+2

यदि आप \ 1 से बचते हैं तो भी आप डबल कोट्स का उपयोग कर सकते हैं। जैसे "\\ 1 __ \\ 2" – seo

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