जांचें कि क्या स्ट्रिंग में एक विकल्प है


113

मैं कैसे जांच सकता हूं कि क्या दिए गए स्ट्रिंग में पर्ल के उपयोग से एक निश्चित सबस्ट्रिंग है?

विशेष रूप से, मैं देखना चाहता हूं कि s1.domain.comदिए गए स्ट्रिंग चर में मौजूद है या नहीं ।

जवाबों:


231

यह पता लगाने के लिए कि क्या स्ट्रिंग में स्ट्रिंग है आप indexफ़ंक्शन का उपयोग कर सकते हैं :

if (index($str, $substr) != -1) {
    print "$str contains $substr\n";
} 

यह की पहली आवृत्ति की स्थिति वापस आ जाएगी $substrमें $str, या -1 अगर सबस्ट्रिंग नहीं मिला है।


6
इस तरह से विशेष रूप से बेहतर है, जब आप एक चर का उपयोग कर खोज कर रहे हैं - इस तरह से आपको वर्णों से बचना नहीं होगा (इस चर स्ट्रिंग में), जो कि नियमित अभिव्यक्ति (जैसे :) के लिए विशेष हैं ।
evgeny9

57

एक और संभावना यह है कि नियमित अभिव्यक्ति का उपयोग करें जो कि पर्ल के लिए प्रसिद्ध है:

if ($mystring =~ /s1\.domain\.com/) {
   print qq("$mystring" contains "s1.domain.com"\n);
}

बैकस्लैश की आवश्यकता है क्योंकि .किसी भी चरित्र से मेल खा सकता है। आप ऑपरेटरों \Qऔर \Eऑपरेटरों का उपयोग करके इसे प्राप्त कर सकते हैं ।

my $substring = "s1.domain.com";
    if ($mystring =~ /\Q$substring\E/) {
   print qq("$mystring" contains "$substring"\n);
}

या, आप यूजीन वाई के रूप में कह सकते हैं और सूचकांक फ़ंक्शन का उपयोग कर सकते हैं । बस चेतावनी का एक शब्द है: अनुक्रमणिका एक रिटर्न -1जब यह एक के बजाय एक मैच नहीं मिल सकता है undefया 0

इस प्रकार, यह एक त्रुटि है:

my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
    print qq("$mystring" doesn't contains "$substring"\n";
} 

यह गलत होगा यदि s1.domain.comआपकी स्ट्रिंग की शुरुआत में है। मैं व्यक्तिगत रूप से एक से अधिक बार इस पर जल चुका हूं।


मुझे लगता index()है कि सरल मामले में regexps से तेज है?
जी। Cito

1
एक के बारे में एक प्रश्न के पर्ल जवाब का प्रयास किया सबस्ट्रिंग को हटाने - मैं गति की तुलना नहीं की, बल्कि =~, index(), ~~और match::simpleसब एक सा लग रहा था awk\ -: -ward ...
जी Cito

आपको यह भी सुनिश्चित करना होगा कि आप जिस तार की तुलना कर रहे हैं, वह केस संवेदी नहीं है। S1.DOMAIN.COM प्रतिस्थापन के लिए काम नहीं करेगा। लेकिन अगर आप lc ($ givendomain), और उसके बाद "s1.domain.com" से तुलना करेंगे, तो वह काम करेगा। इसके अलावा,
प्रतिस्थापन

@ डेविड डब्ल्यू। किसी भी तरह मैं ऊपर के रेक्स का उपयोग करके domain.comमैच नहीं कर सकता subdomain.domain.com, किसी भी विचार?
11

14

केस असंवेदनशील पदार्थ उदाहरण

यह यूजीन के उत्तर का विस्तार है, जो स्ट्रिंग को निचोड़ने से पहले निचली स्थिति में परिवर्तित करता है:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
} 

1
ध्यान दें कि केस-असंवेदनशील तुलना के लिए fcसिफारिश की गई है lc
मेलेपोमेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.