2009-07-31 11 views
15

रूबी का उपयोग करके, मैं "xy y ay xy + y" में 'y' की सभी घटनाओं से मेल खाने के लिए एक एकल रेगेक्स का उपयोग कैसे कर सकता हूं जो x (y, ay, + वाई)?
/[^ x] y/भी पूर्ववर्ती चरित्र से मेल खाता है, तो मैं एक विकल्प की जरूरत है ...regexp स्ट्रिंग 1 से पहले जब तक स्ट्रिंग 2

+0

मैं एक नकारात्मक lookbehind सुझाव देने के लिए जा रहा था, लेकिन ऐसा लगता है कि आप उस स्कोर पर भाग्य से बाहर हो: http://www.regular-expressions.info /lookaround.html#limitbehind। * "अंत में, जावास्क्रिप्ट, रूबी और टीसीएल जैसे स्वाद बिल्कुल समर्थन नहीं करते हैं, भले ही वे समर्थन देखें।" * –

+0

यह भी देखें http://stackoverflow.com/questions/530441/how-would-you-use- एक नियमित-अभिव्यक्ति-से-अनदेखा-तार-जिसमें-एक-विशिष्ट – finnw

+0

यदि पीछे-पीछे के दावे समर्थित नहीं हैं, तो हम इसका उपयोग कर सकते हैं: '([^ x] y") | (^ y ")' । 'y' स्ट्रिंग की शुरुआत में दिखाई दे सकता है और उस मामले को '/ [^ x] y /' द्वारा कवर नहीं किया गया है। – approxiblue

उत्तर

34

आपको शून्य-चौड़ाई नकारात्मक दिखने वाले दावे की आवश्यकता है। /(?<!x)y/ का प्रयास करें जो वास्तव में कहता है कि आप क्या खोज रहे हैं, यानी 'x' से पहले 'y' को पहले से नहीं मिला है, लेकिन इसमें पूर्व वर्ण शामिल नहीं है, जो शून्य-चौड़ाई भाग है।

जोड़ने के लिए संपादित: जाहिर है यह केवल रूबी 1.9 और ऊपर से समर्थित है।

-1

PCRE में, आप एक नकारात्मक लुक-पीछे का उपयोग करें:

(:<!x)y 

सुनिश्चित नहीं हैं कि अगर यह है रुबी द्वारा समर्थित, लेकिन आप हमेशा देख सकते हैं।

-1

यह पीछे नकारात्मक रूप से किया जा सकता है, (?<!x)y

2

रूबी दुर्भाग्य से नकारात्मक lookbehind का समर्थन नहीं करता है, तो आप मुसीबत होगा यदि आप एक ही चरित्र की तुलना में अधिक के लिए देखने की जरूरत है। सिर्फ एक चरित्र के लिए, आप मैच पर कब्जा करके इस की देखभाल कर सकते हैं:

/[^x](y)/ 
+0

आह, मैं रूबी विशेषज्ञ नहीं हूं - jbourque का कहना है कि नकारात्मक रूबी नई रूबी में है। आपका असली जवाब है। – Cascabel

+0

[^ x] एक वर्ण से मेल खाना चाहिए। यदि वाई लाइन की शुरुआत में होता है तो हमें इसे मेल खाना चाहिए:/(?: \ ए |^| [^ x]) y / –

3

नकारात्मक लुक-पीछे रूबी 1.9 जब तक समर्थित नहीं है, लेकिन आप स्कैन का उपयोग कर कुछ इसी तरह कर सकते हैं:

"xy y ay xy +y".scan(/([^x])(y)/) # => [[" ", "y"], ["a", "y"], ["+", "y"]] 
"xy y ay xy +y".scan(/([^x])(y)/).map {|match| match[1]} # => ["y", "y", "y"] 

बेशक, यदि आप y से पहले एक ही चरित्र से अधिक से बचना चाहते हैं तो यह अधिक कठिन है। तो फिर तुम जैसे कुछ करने के लिए चाहते हैं:

"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/} # => [[" ", "y"], [" ball", "y"], [" +", "y"]] 
"abby y crabby bally +y".scan(/(.*?)(y)/).reject {|str| str[0] =~ /ab/}.map {|match| match[1]} # => ["y", "y" "y"] 
संबंधित मुद्दे