Vim regex 9 से अधिक कैप्चर समूहों को अनुमति क्यों नहीं देता है?


16

से :h E65हम देख सकते हैं कि विम एक प्रतिस्थापन आदेश की तुलना में अधिक 9 कैप्चर समूहों की अनुमति नहीं है।

उदाहरण के लिए निम्नलिखित कमांड काम करेगी:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1

लेकिन यह एक और अधिक कब्जा समूह के साथ विफल हो जाएगा:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1

मेरा सवाल यह नहीं है कि यह विफल क्यों है (यह एक विम सीमा है) लेकिन विम के बारे में यह सीमा बिल्कुल क्यों नहीं है?

इसके अलावा, मुझे पता है कि 9 से अधिक कब्जा समूह के साथ एक वास्तविक जीवन regex शायद पढ़ने के लिए और बनाए रखने के लिए बहुत राक्षसी होगा, लेकिन मैं अभी भी उत्सुक हूं।


2
शायद केवल विम से संबंधित नहीं: stackoverflow.com/a/10993346/2558252
— nobe4

1
@ nobe4: दिलचस्प! तो शायद लोगों को इन उपकरणों माना जाता है कि 9 से अधिक समूहों बेकार थे बनाने ...
— statox

मुझे लगता है कि यह सीमा vi से आती है, जिसे ed / sed से सीमा विरासत में मिली है। कुछ साल पहले मैंने 99 समूहों को समर्थन देने के लिए एक पैच बनाया था, लेकिन इसे शामिल नहीं किया गया था
— क्रिश्चियन ब्रेबेंड

1
@ChristianBrabandt सांख्यिक झंडे को लागू करने के लिए एक और उपयोगी अतिरिक्त होगा जैसे sed: s/.../.../3पैटर्न की केवल 3 घटना को प्रतिस्थापित करेगा। शायद यही वह विशेषता है जो मुझे विम में सबसे ज्यादा याद आती है।
— सातो कैटसुरा

2
कैप्चर नाम का समर्थन इस समस्या को कम करने का एक और तरीका होगा। यह कहा जा रहा है, 9 बार कब्जा समूहों के पास मैंने कहीं भी देखा है जब लोग नहीं जानते थे कि वे गैर-कैप्चरिंग समूहों का उपयोग कर सकते हैं - \%()।
— जामसेन

जवाबों:


24

स्पष्ट कारण यह है कि दो या दो से अधिक अंकों वाले \12समूह अस्पष्ट हैं: समूह 12 के रूप में लिया जाना चाहिए, या समूह 1 के बाद स्ट्रिंग के रूप में लिया जाना चाहिए 2?

दक्षता से संबंधित अन्य कारण हैं (घातीय मिलान समय और जैसे)। जब edलिखा गया तो ये शो स्टॉपर थे । तब से बेहतर एल्गोरिदम की खोज की गई है।


यह एक अच्छी संभावना है, क्या आपके पास इस संबंध में कोई संदर्भ / रीडिंग है?
— nobe4

2
@ nobe4 अस्पष्टता भाग के लिए: नहीं, लेकिन IMO यह स्पष्ट है। दक्षता भाग के लिए, आपको regexps के शुरुआती कार्यान्वयन के बारे में पढ़ना होगा। यह उस समय एक प्रसिद्ध समस्या थी। मेरे पास सटीक उद्धरण नहीं हैं, लेकिन उन्हें ढूंढना मुश्किल नहीं होना चाहिए।
— सातो कैटसुरा

वास्तव में यह पूरी तरह से प्रशंसनीय लगता है।
— statox

4
हां, यह लगभग निश्चित रूप से है कि पार्सर को बैकस्लैश के बाद एक अंक के लिए लिखा गया था, और कभी नहीं बदला। यह काफी पहले से ही सामान्य था। अन्य भाषाएं इसके आस-पास के तरीकों के साथ आई हैं (उदाहरण के लिए, केवल \11एक कैप्चर के संदर्भ में विचार करना अगर उनमें से कम से कम 11 हैं, जो असंगत है, लेकिन आमतौर पर ठीक है; और \g{11}बैकरेफेरेंस और ${11}प्रतिस्थापन के लिए जैसी चीजें ), लेकिन विम कभी नहीं है उनमें से कोई भी शुरू किया।
— hobbs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.