2010-08-13 16 views
18
### Ruby 1.8.7 ### 

require 'rubygems' 
require 'oniguruma' # for look-behind 

Oniguruma::ORegexp.new('h(?=\w*)') 
# => /h(?=\w*)/ 

Oniguruma::ORegexp.new('(?<=\w*)o') 
# => ArgumentError: Oniguruma Error: invalid pattern in look-behind 

Oniguruma::ORegexp.new('(?<=\w)o') 
# => /(?<=\w)o/ 


### Ruby 1.9.2 rc-2 ### 

"hello".match(/h(?=\w*)/) 
# => #<MatchData "h"> 

"hello".match(/(?<=\w*)o/) 
# => SyntaxError: (irb):3: invalid pattern in look-behind: /(?<=\w*)o/ 

"hello".match(/(?<=\w)o/) 
# => #<MatchData "o"> 

मैं पीछे-पीछे के साथ क्वांटिफायर का उपयोग नहीं कर सकता?क्वांटिफ़ायर के साथ समस्या और पीछे-पीछे

उत्तर

24

मुद्दा यह है कि रूबी परिवर्तनीय-लंबाई के रूप में समर्थन नहीं करता है। Quantifiers प्रति से बाहर नहीं हैं, लेकिन वे देखो की लंबाई को nondeterministic होने का कारण नहीं बना सकते हैं।

पर्ल का एक ही प्रतिबंध है, जैसा कि रेगेक्स की विशेषता वाली हर प्रमुख भाषा के समान है।

दिखने के बजाए सीधा मिलान (\w*)\W*?o का उपयोग करने का प्रयास करें।

5

मैं एक ही समस्या के खिलाफ अपने सिर पर टक्कर लगी थी, और बोरेलिद के जवाब ने इस मुद्दे को अच्छी तरह से समझाने में मदद की।

हालांकि, मुझे यह सोचने लगा। हो सकता है कि क्वांटिफायर को के अंदर देखने की आवश्यकता नहीं है, लेकिन इसे पर दिखने पर लागू किया जा सकता है?

"hello".match(/(?<=\w*)o/) 
# => SyntaxError: (irb):3: invalid pattern in look-behind: /(?<=\w*)o/ 

"hello".match(/(?<=\w)*o/) 
# => #<MatchData "o"> 

तो अब हम निरंतर लंबाई lookbehinds के परिवर्तनशील है। मेरे लिए इस मुद्दे को बाईपास करना प्रतीत होता है। :)

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