2010-03-24 12 views
7

का उपयोग माणिक regexp मैं निम्नलिखित परिणाम प्राप्त:रूबी रेगेक्सपी: + बनाम *। विशेष व्यवहार?

>> 'foobar'[/o+/] 
=> "oo" 
>> 'foobar'[/o*/] 
=> "" 

लेकिन:

>> 'foobar'[/fo+/] 
=> "foo" 
>> 'foobar'[/fo*/] 
=> "foo" 

प्रलेखन कहते हैं:
*: एक या अधिक repetitions: शून्य या अधिक पूर्ववर्ती
+ की पुनरावृत्ति पूर्ववर्ती

की तो मैं उम्मीद करते हैं कि 'foobar' [/ ओ * /] 'foobar' के रूप में एक ही परिणाम देता है [/ ओ + /]

'foobar'[/o+/] इसलिए क्योंकि वहाँ की जरूरत है कम से कम 1 o होने के लिए, वहाँ से मेल नहीं कर सकते हैं

किसी स्थिति 0 पर, कि

उत्तर

14

'foobar'[/o*/] के लिए एक स्पष्टीकरण मिलान किया जाता है शून्य o कि f से पहले दिखाई देते है यह बजाय स्थिति से सभी o रों से मेल खाता है 1

विशेष रूप से, मैचों आप देख रहे हैं

'foobar'[/o*/]=> 0 कर रहे हैं
'foobar'[/o+/]=>'f<oo>bar'

3

यह कैसे काम करता है regexp का एक आम गलतफहमी है।

हालांकि * लालची है और स्ट्रिंग की शुरुआत में लंगर नहीं है, फिर भी regexp इंजन स्ट्रिंग की शुरुआत से दिखना शुरू कर देगा। "/ O + /" के मामले में, यह स्थिति 0 (उदाहरण के लिए "एफ") से मेल नहीं खाता है, लेकिन चूंकि + का मतलब एक या अधिक है, इसलिए इसे मिलान करना जारी रखना है (इसमें लालच से कोई लेना देना नहीं है) मैच पाया जाता है या सभी पदों का मूल्यांकन किया जाता है।

हालांकि "/ o * /" के मामले में, जैसा कि आप जानते हैं 0 या अधिक बार, जब यह स्थिति 0 से मेल नहीं खाता है, तो regexp इंजन उस बिंदु पर गहराई से रुक जाएगा (जैसा कि इसे करना चाहिए, क्योंकि ओ * बस मतलब है कि ओ वैकल्पिक है)। प्रदर्शन कारण भी हैं, क्योंकि "ओ" वैकल्पिक है, इसके लिए और अधिक समय क्यों व्यतीत करते हैं?

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