2010-08-26 15 views
8

मैंपर्ल में एक स्ट्रिंग से संख्या निकालने के लिए कैसे?

print $str; 
abcd*%1234$sdfsd..#d 

स्ट्रिंग हमेशा संख्या का केवल एक निरंतर खिंचाव, इस मामले में 1234 की तरह होगा। बाकी सभी या तो अक्षर या अन्य विशेष पात्र होंगे।

मैं इस मामले में संख्या (1234) कैसे निकाल सकता हूं और उसे str में संग्रहीत कर सकता हूं?

This page सुझाव देता है कि मुझे \d का उपयोग करना चाहिए, लेकिन कैसे?

उत्तर

17
$str =~ s/\D//g; 

यह स्ट्रिंग से सभी नोडिगिट वर्ण हटा देता है। यही वह सब है जो आपको करने की ज़रूरत है।

संपादित करें: यदि अन्य लिपियों में यूनिकोड अंक मौजूद हो सकता है, एक बेहतर समाधान है:

$str =~ s/[^0-9]//g; 
+1

Lazer एक संख्या के लिए पूछ रहा है, सिर्फ एक पूर्णांक नहीं। यह regexp '.',' e' ड्रॉप करेगा जिसका उपयोग फ्लोट बनाने के लिए किया जा सकता है। पर्ल में यूनिकोड समर्थन के कारण भी '\ d' केवल '[0-9]' नहीं है: अन्य लोगों में अंक ग्लिफ (जैसे भारतीय) मान्य हैं। तो आपका regexp तारों को भी स्वीकार करेगा जो संख्याएं नहीं हैं। – dolmen

+0

@ डॉल्मेन Lazer, तो अधिक विशिष्ट होना चाहिए। उनके उदाहरण में दशमलव या घातीय शामिल नहीं हैं, और मैं यह सुनिश्चित नहीं कर सकता कि वह उन्हें शामिल करना चाहता है या नहीं। आप यूनिकोड संस्करण स्क्रिप्ट अंकों के बारे में सही हैं, हालांकि, मैं संपादित करूंगा। –

26

आप मूल स्ट्रिंग को संशोधित नहीं करना चाहते हैं, तो आप उन में कब्जा कर नंबर निकाल सकते हैं subpatterns का उपयोग कर regex। सूची संदर्भ में, एक नियमित अभिव्यक्ति subpatterns में परिभाषित मैचों को वापस देता है।

my $str = 'abc 123 x456xy 789foo'; 

my ($first_num) = $str =~ /(\d+)/; # 123 
my @all_nums = $str =~ /(\d+)/g; # (123, 456, 789) 
+0

+1। मेरे जवाब पर इसका लाभ है कि यह नहीं मानता कि स्ट्रिंग में केवल एक एम्बेडेड नंबर है। –

1

व्यक्तिगत रूप से, मैं इसे इस तरह करना होगा:

$s =~ /([0-9]+)/; 
print $1; 

$ 1 पहले समूह को देखते हुए नियमित अभिव्यक्ति (दौर कोष्ठक में भाग) मेल खाने वाले शामिल होंगे।

+2

जब तक आपने पहली बार पुष्टि नहीं की है कि आपका मैच सफल हुआ है, तब तक '$ 1', '$ 2', आदि में मान का उपयोग न करें। कैप्चर वैरिएबल एक सफल मैच पर केवल (पुनः) सेट है, अगर आपके उदाहरण में '$ s' में कोई अंक नहीं है तो आपको अपने अंतिम मैच का परिणाम मिलेगा। –

+0

वाह, मेरे बारे में मूर्खतापूर्ण कैसे। स्पष्टीकरण के लिए धन्यवाद। बस यह सुनिश्चित करने के लिए कि मैं अपना सबक सीखूं ... क्या है अगर ($ s = ~/([0-9] +) /) समूहिंग चर का उपयोग करने के लिए सही तरीका $ 1' प्रिंट करें? – Ziggy

4

यदि आप इसे विनाशकारी तरीके से करना चाहते हैं, तो यह करने का सबसे तेज़ तरीका है।

$str =~ tr/0-9//cd; 

tr anslate कुछ भी नहीं करने के लिए 0-9 की c omplement में सभी वर्ण, d उन्हें हटाएं।

इस दृष्टिकोण के लिए एक चेतावनी, और फिलिप पॉटर, यह है कि स्ट्रिंग के नीचे अंकों का एक और समूह था, वे अंकों के पहले समूह के साथ मिलकर बन जाएंगे। तो यह स्पष्ट नहीं है कि आप यह करना चाहते हैं।

निश्चित तरीका एक पाने के लिए और अंकों का केवल एक ही समूह

($str) = $str =~ /(\d+)/; 

मैच एक सूची संदर्भ में कैप्चर की सूची लौटाता है। $str के आसपास के माता-पिता अभिव्यक्ति को सूची संदर्भ में रखने के लिए हैं और पहले कैप्चर को $str पर असाइन करें।

+0

सबसे अच्छा जवाब! – dolmen

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