2010-08-09 1 views

उत्तर

16
my($substr) = $string =~ /.*x(.*)/; 

perldoc perlre से:

डिफ़ॉल्ट रूप से, एक मात्रा निर्धारित subpattern "लालची" वह यह है कि यह रूप में कई बार संभव के रूप में, जबकि अभी भी अनुरूप होगा (एक विशेष प्रारंभिक स्थान दिया गया है) है, बाकी पैटर्न को मिलान करने की अनुमति देता है।

यही कारण है कि .*xx के अंतिम अवसर तक मेल खाएगा।

7

सबसे आसान तरीका /([^x]*)$/

5

उपयोग करने के लिए पहले उत्तर एक अच्छा एक है, है, लेकिन जब "कुछ है कि शामिल नहीं है" के बारे में बात ... होगा मैं regex कि "मैच" का उपयोग करना चाहते यह

my($substr) = $string =~ /.*x([^x]*)$/;

कुछ मामले में बहुत उपयोगी

+0

+1 वास्तव में बहुत उपयोगी –

+1

आपको रेगेक्स में अग्रणी '। * X' की आवश्यकता नहीं है। – runrig

+0

यह सही है, धन्यवाद, लेकिन यह "कुछ ऐसा नहीं है जो x शामिल नहीं है" – benzebuth

1

नियमित अभिव्यक्ति: /([^x]+)$/#assuming x is not last element of the string.

2

सबसे सरल तरीका नियमित अभिव्यक्ति नहीं है, लेकिन एक साधारण विभाजन() और अंतिम तत्व प्राप्त करना।

$string="axxxghdfx445"; 
@s = split /x/ , $string; 
print $s[-1]; 
+0

क्या यह वास्तव में अस्थायी सरणी बनाने के लिए लायक है? 'प्रिंट (विभाजन/एक्स /, $ स्ट्रिंग) [- 1]; 'बस भी काम करेगा। – Zaid

+0

सही निर्भर करता है? अगर मैं अन्य तत्वों का उपयोग करना चाहता हूं तो क्या होगा? – ghostdog74

3

फिर भी ऐसा करने का एक और तरीका। यह एक नियमित अभिव्यक्ति के रूप में उतना आसान नहीं है, लेकिन यदि आप गति के लिए अनुकूलित कर रहे हैं, तो यह दृष्टिकोण शायद split सहित रेगेक्स का उपयोग करके किसी भी चीज़ से तेज़ होगा।

my $s  = 'axxxghdfx445'; 
my $p  = rindex $s, 'x'; 
my $match = $p < 0 ? undef : substr($s, $p + 1); 
3

मैं हैरान कोई भी विशेष चर है कि इस करता है उल्लेख किया है हूँ, $': "$'" का मिलान स्ट्रिंग के बाद सब कुछ देता है। (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}; 

मैं विनम्रतापूर्वक, प्रस्तुत होता है कि इस मार्ग सबसे अच्छा और सबसे सीधी-सपाट ज्यादातर मामलों में दृष्टिकोण है, क्योंकि यह की आवश्यकता नहीं है कि आप पुनः प्राप्त करने में अपने पैटर्न निर्माण के साथ विशेष बातें करना पोस्टमैच भाग, और वहां कोई प्रदर्शन जुर्माना नहीं है।

+1

सिवाय इसके कि आप 'एक्स' के पहले मौके को पकड़ रहे हैं, आखिरी नहीं। – runrig

+0

@runrig: lol, मेरे पूरे थीसिस को खत्म करने का तरीका :) दरअसल, इस विशेष मामले में, '/ x ([^ x] *) $ /' बेहतर होगा ... मैं '$' का वर्णन करने में भी पकड़ा गया ', जो हर किसी ने अनदेखा किया था। – Ether

+0

यदि आप '' 'चरित्र से पहले' \ 'डालते हैं तो आप अपने उद्धरण के बीच में कोड शैली से बच सकते हैं। – CyberSkull

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

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