2011-09-14 26 views
6

में विशेष वर्णों से बचने के लिए मैं पर्ल में एक नियमित अभिव्यक्ति से मिलान करने की कोशिश कर रहा हूं। मेरे कोड ऐसा दिखाई देता है:पर्ल रेगेक्स

my $source = "Hello_[version]; Goodbye_[version]"; 
my $pattern = "Hello_[version]"; 
if ($source =~ m/$pattern/) { 
    print "Match found!" 
} 

समस्या में उठता है कि कोष्ठक एक चरित्र वर्ग से संकेत मिलता है (या तो मैं पढ़ने के लिए) जब पर्ल रेगुलर एक्सप्रेशन से मेल करने की कोशिश करता है, और मैच में नाकाम रहने के समाप्त होता है। मुझे पता है कि मैं \[ या \] के साथ ब्रैकेट से बच सकता हूं, लेकिन स्ट्रिंग के माध्यम से जाने और ब्रैकेट की खोज के लिए कोड के दूसरे ब्लॉक की आवश्यकता होगी। क्या अलग-अलग भागने के बिना ब्रैकेट को स्वचालित रूप से अनदेखा करने का कोई तरीका है?

त्वरित नोट: मैं केवल बैकस्लैश नहीं जोड़ सकता, क्योंकि यह सिर्फ एक उदाहरण है। मेरे असली कोड में, $source और $pattern दोनों पर्ल कोड (या तो URIEncoded या फ़ाइल से) से बाहर आ रहे हैं।

उत्तर

10

आप नौकरी के लिए गलत टूल का उपयोग कर रहे हैं।

आपके पास कोई पैटर्न नहीं है! $ पैटर्न में कोई regex वर्ण नहीं हैं!

आपके पास एक शाब्दिक स्ट्रिंग है।

सूचकांक()

my $source = "Hello_[version]; Goodbye_[version]"; 
my $pattern = "Hello_[version]"; 
if (index($source, $pattern) != -1) { 
    print "Match found!"; 
} 
+0

+1 इंडेक्स() – sln

+0

का उपयोग करने के लिए "रेगेक्स कैरेक्टर" वास्तव में क्या है? मैं इस धारणा के तहत था कि रेगेक्स तारों में तारों या पैटर्न से मेल खाने का एक साधन है, न कि वर्णों का एक विशिष्ट सेट, जब तक इसका कोई और अर्थ न हो, मुझे पता नहीं है? हालांकि, सूचकांक() के लिए धन्यवाद। जब मैं कल अपने सर्वर पर हूं तो मैं उसे एक शॉट दूंगा; मुझे लगता है कि इंडेक्स() बेहतर काम करेगा और रेगेक्स मिलान से क्लीनर होगा। – CoV

+0

"रेगेक्स कैरेक्टर" एक टाइपो था, मेरा मतलब था "रेगेक्स मेटाएक्टेक्टर"। – tadmc

11

उपयोग quotemeta(): जब तक \E पाया या पैटर्न के अंत है

my $source = "Hello_[version]; Goodbye_[version]"; 
my $pattern = quotemeta("Hello_[version]"); 
if ($source =~ m/$pattern/) { 
    print "Match found!" 
} 
11

\Q अक्षरों से परे अक्षम हो जाएगा।

my $source = "Hello_[version]; Goodbye_[version]"; 
my $pattern = "Hello_[version]"; 
if ($source =~ m/\Q$pattern/) { 
    print "Match found!" 
} 

http://www.anaesthetist.com/mnm/perl/Findex.htm

+0

धन्यवाद के साथ # पाठ मुझे पता था कि यह सरल उपाय था, कि पूरी तरह से काम किया – CoV

+0

बदली गई मेरा "स्वीकृत उत्तर", क्षमा करें, लेकिन जब आपका काम ठीक काम करता है, तो मुझे लगता है कि 'इंडेक्स()' वास्तव में मैं जो खोज रहा था वह वास्तव में था। धन्यवाद! – CoV

-1

रेगुलर एक्सप्रेशन के प्रयोजन का हवाला देते हुए एक $pattern हार जब तक इसकी के रूप में इस्तेमाल किया जा रहा एक शाब्दिक जाना जाता है और एक असली regex में फेंक दिया जा रहा है।

संपादित
अन्यथा, बस index() का उपयोग सबस्ट्रिंग की स्थिति का पता लगाने के लिए। यदि आवश्यक हो तो उस जानकारी के साथ बस आसपास के डेटा निकालने के लिए substr() का उपयोग करें।

+0

क्या सबस्ट्रेट() का उपयोग करें? – tadmc

+0

मैं इंडेक्स() का उपयोग करने के लिए इंडेक्स() का उपयोग करूंगा अवशिष्ट डेटा निकालने के लिए स्थिति, फिर substr() (वैकल्पिक रूप से)। – sln

0

आप निम्न आदेश का उपयोग करके एक अभिव्यक्ति में विशेष वर्ण का सेट बच सकते हैं शाब्दिक तार के साथ काम करने के लिए है ...।

अभिव्यक्ति 1 = 'विशेष वर्णों के साथ पाठ $%()';

अभिव्यक्ति 1 = ~ एस/[\? * + \^\ $ [] \() {} \ | -]/"\ $ &"/उदाहरण;

यह सभी विशेष वर्ण से बचें जाएगा

प्रिंट "expression1 ';! \ $ \% जैसे विशेष वर्ण()

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