उदाहरण के लिए, में अंतिम x
के बाद स्ट्रिंग का हिस्सा लौटाएं (445
वापस लौटाएं)।पर्ल नियमित अभिव्यक्ति में कुछ char की आखिरी घटना के बाद मैं उन सभी चीज़ों से कैसे मेल खा सकता हूं?
पर्ल नियमित अभिव्यक्ति में कुछ char की आखिरी घटना के बाद मैं उन सभी चीज़ों से कैसे मेल खा सकता हूं?
उत्तर
my($substr) = $string =~ /.*x(.*)/;
perldoc perlre से:
डिफ़ॉल्ट रूप से, एक मात्रा निर्धारित subpattern "लालची" वह यह है कि यह रूप में कई बार संभव के रूप में, जबकि अभी भी अनुरूप होगा (एक विशेष प्रारंभिक स्थान दिया गया है) है, बाकी पैटर्न को मिलान करने की अनुमति देता है।
यही कारण है कि .*x
x
के अंतिम अवसर तक मेल खाएगा।
सबसे आसान तरीका /([^x]*)$/
उपयोग करने के लिए पहले उत्तर एक अच्छा एक है, है, लेकिन जब "कुछ है कि शामिल नहीं है" के बारे में बात ... होगा मैं regex कि "मैच" का उपयोग करना चाहते यह
my($substr) = $string =~ /.*x([^x]*)$/;
कुछ मामले में बहुत उपयोगी
नियमित अभिव्यक्ति: /([^x]+)$/
#assuming x is not last element of the string.
सबसे सरल तरीका नियमित अभिव्यक्ति नहीं है, लेकिन एक साधारण विभाजन() और अंतिम तत्व प्राप्त करना।
$string="axxxghdfx445";
@s = split /x/ , $string;
print $s[-1];
क्या यह वास्तव में अस्थायी सरणी बनाने के लिए लायक है? 'प्रिंट (विभाजन/एक्स /, $ स्ट्रिंग) [- 1]; 'बस भी काम करेगा। – Zaid
सही निर्भर करता है? अगर मैं अन्य तत्वों का उपयोग करना चाहता हूं तो क्या होगा? – ghostdog74
फिर भी ऐसा करने का एक और तरीका। यह एक नियमित अभिव्यक्ति के रूप में उतना आसान नहीं है, लेकिन यदि आप गति के लिए अनुकूलित कर रहे हैं, तो यह दृष्टिकोण शायद split
सहित रेगेक्स का उपयोग करके किसी भी चीज़ से तेज़ होगा।
my $s = 'axxxghdfx445';
my $p = rindex $s, 'x';
my $match = $p < 0 ? undef : substr($s, $p + 1);
मैं हैरान कोई भी विशेष चर है कि इस करता है उल्लेख किया है हूँ, $'
: "$'
" का मिलान स्ट्रिंग के बाद सब कुछ देता है। (perldoc perlre)
my $str = 'axxxghdfx445';
$str =~ /x/;
# $' contains '445';
print $';
हालांकि, वहाँ एक लागत (जोर मेरा) है:
चेतावनी: एक बार पर्ल देखता है कि आप $ & में से एक की जरूरत है, "$
", or "$'" anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program. Perl uses the same mechanism to produce $1, $2, etc, so you also pay a price for each pattern that contains capturing parentheses. (To avoid this cost while retaining the grouping behaviour, use the extended regular expression "(?: ...)" instead.) But if you never use $&, "$
" या "$", तो बिना कैप्चरिंग कोष्ठक के पैटर्न को दंडित नहीं किया जाएगा। तो $ &, "$" ", और " $ `" से बचें, यदि आप कर सकते हैं, लेकिन यदि आप नहीं कर सकते हैं (और कुछ एल्गोरिदम वास्तव में उनकी सराहना करते हैं), एक बार जब आप उन्हें एक बार उपयोग करते हैं, तो उन्हें इच्छानुसार उपयोग करें, क्योंकि आपने पहले ही कीमत चुकाई है। 5.005 के रूप में, $ & अन्य दो के रूप में इतना महंगा नहीं है।
लेकिन प्रतीक्षा करें, और भी कुछ है! आपको एक के मूल्य के लिए दो ऑपरेटर मिलते हैं, अभी कार्य करें!
इस समस्या के लिए एक समाधान के रूप में पर्ल 5.10.0 परिचय "$ {^ PREMATCH}", "$ {^ मैच}" और "$ {^ POSTMATCH}" है, जो बराबर हैं को "$ `", $ & और "$" ", सिवाय इसके कि उन्हें केवल होने की गारंटी है जो"/p " (संरक्षित) संशोधक के साथ निष्पादित एक सफल मैच के बाद परिभाषित किया गया है। इन चरों का उपयोग कोई वैश्विक निष्पादन जुर्माना नहीं लगाता है, उनके विराम चिह्न चार समकक्षों के विपरीत, हालांकि व्यापार-बंद पर आपको जब आप उन्हें उपयोग करना चाहते हैं तो पर्ल को बताना होगा।
my $str = 'axxxghdfx445';
$str =~ /x/p;
# ${^POSTMATCH} contains '445';
print ${^POSTMATCH};
मैं विनम्रतापूर्वक, प्रस्तुत होता है कि इस मार्ग सबसे अच्छा और सबसे सीधी-सपाट ज्यादातर मामलों में दृष्टिकोण है, क्योंकि यह की आवश्यकता नहीं है कि आप पुनः प्राप्त करने में अपने पैटर्न निर्माण के साथ विशेष बातें करना पोस्टमैच भाग, और वहां कोई प्रदर्शन जुर्माना नहीं है।
सिवाय इसके कि आप 'एक्स' के पहले मौके को पकड़ रहे हैं, आखिरी नहीं। – runrig
@runrig: lol, मेरे पूरे थीसिस को खत्म करने का तरीका :) दरअसल, इस विशेष मामले में, '/ x ([^ x] *) $ /' बेहतर होगा ... मैं '$' का वर्णन करने में भी पकड़ा गया ', जो हर किसी ने अनदेखा किया था। – Ether
यदि आप '' 'चरित्र से पहले' \ 'डालते हैं तो आप अपने उद्धरण के बीच में कोड शैली से बच सकते हैं। – CyberSkull
- 1. RegEx: मैं 49 से अधिक की सभी संख्याओं से कैसे मेल खा सकता हूं?
- 2. नियमित अभिव्यक्ति से मेल खाने वाले सभी शब्दों की सूची
- 3. क्या पर्ल रेगेक्स CamelCase शब्दों से मेल खा सकता है?
- 4. मैं विभाजक की आखिरी घटना पर केवल एक पर्ल स्ट्रिंग कैसे विभाजित कर सकता हूं?
- 5. सभी मुद्रा प्रतीकों से मेल खाने के लिए नियमित अभिव्यक्ति?
- 6. किसी भी तीन अंक संख्या मूल्य से मेल खाने के लिए मैं नियमित अभिव्यक्ति कैसे लिखूं?
- 7. डिबगिंग पर्ल नियमित अभिव्यक्ति
- 8. मैं अलग-अलग चर में पर्ल नियमित अभिव्यक्ति से कैप्चर कैसे स्टोर कर सकता हूं?
- 9. मैं एक पर्ल नियमित अभिव्यक्ति में एक शाब्दिक बिंदु की अनुमति कैसे दे सकता हूं?
- 10. डॉलर की मात्रा से मेल खाने के लिए नियमित अभिव्यक्ति
- 11. मैं अजगर में नियमित अभिव्यक्ति कैसे डिबग कर सकता हूं?
- 12. एक पर्ल नियमित अभिव्यक्ति
- 13. नाम से मेल खाने के लिए मैं नियमित अभिव्यक्ति का उपयोग कैसे करूं?
- 14. मैं उन सभी पंक्तियों को कैसे हटा सकता हूं जो कुछ वर्णों से शुरू नहीं होते हैं?
- 15. नियमित अभिव्यक्ति - सभी शब्दों से मेल खाते हैं लेकिन केवल
- 16. जावा नियमित अभिव्यक्ति, सबकुछ से मेल खाता है लेकिन
- 17. फ़ोल्डर में सभी फ़ाइलों को बाहर करने के लिए मैं नियमित अभिव्यक्ति कैसे बढ़ा सकता हूं?
- 18. मल्टीलाइन टेक्स्टबॉक्स में नियमित अभिव्यक्ति की एकाधिक घटना
- 19. मैं पर्ल स्ट्रिंग में कोड जैसी चीज़ों से कैसे बच सकता हूं?
- 20. नियमित अभिव्यक्ति - रूबी बनाम पर्ल
- 21. मैं एनएसएसटींग में एक सबस्ट्रिंग की आखिरी घटना कैसे पा सकता हूं?
- 22. रेगेक्स - सभी घटनाओं से मेल खाते हैं?
- 23. सामान्य एसक्यूएल वाक्यविन्यास से मेल खाने के लिए नियमित अभिव्यक्ति?
- 24. मैं नियमित अभिव्यक्ति के 0 टोकन "(गलत शब्द) की पहचान कैसे कर सकता हूं
- 25. हास्केल प्रकार से मेल नहीं खा सकता है, कठोर चर
- 26. क्या करता है \ डी पर्ल नियमित अभिव्यक्ति
- 27. रूबी में नियमित अभिव्यक्ति का हिस्सा कैसे बना सकता हूं?
- 28. मैं तारों से कैसे मिलान कर सकता हूं जो पर्ल में किसी विशेष पैटर्न से मेल नहीं खाते हैं?
- 29. PowerShell: नियमित रूप से उन
- 30. पर्ल विभाजन और नियमित अभिव्यक्ति
+1 वास्तव में बहुत उपयोगी –
आपको रेगेक्स में अग्रणी '। * X' की आवश्यकता नहीं है। – runrig
यह सही है, धन्यवाद, लेकिन यह "कुछ ऐसा नहीं है जो x शामिल नहीं है" – benzebuth