2009-12-22 13 views
13

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

www.abc.com 

भाग निकले संस्करण होगा:

www\.abc\.com 

मैं उपयोग करने के लिए जा रहा था:

$string =~ s/[.*+?|()\[\]{}\\]/\\$&/g; # Escapes special regex chars 

लेकिन मैं सिर्फ यकीन है कि वहाँ एक क्लीनर में निर्मित आपरेशन नहीं है कि बनाना चाहते थे कि मुझे याद आ रही है?

+1

मैंने इसका उत्तर भी दिया है http://stackoverflow.com/questions/1893067/how-can-i-match-in-a-regular-expression/1894320#1894320 –

+1

संभावित डुप्लिकेट [मैं विशेष वर्ण कैसे प्रबंधित करूं एक पर्ल रेगेक्स में?] (http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

उत्तर

30

quotemeta या \Q...\E का उपयोग करें।

निम्नलिखित परीक्षण कार्यक्रम कि quotemeta साथ, $str के रूप में है के खिलाफ मेल खाता है पर विचार करें, और \Q...\E साथ: उत्पादन में

#! /usr/bin/perl 

use warnings; 
use strict; 

my $str = "www.abc.com"; 

my @test = (
    "www.abc.com", 
    "www/abc!com", 
); 

sub ismatch($) { $_[0] ? "MATCH" : "NO MATCH" } 

my @match = (
    [ as_is => sub { ismatch /$str/ } ], 
    [ qmeta => sub { my $qm = quotemeta $str; ismatch /$qm/ } ], 
    [ qe => sub { ismatch /\Q$str\E/ } ], 
); 

for (@test) { 
    print "\$_ = '$_':\n"; 

    foreach my $method (@match) { 
    my($name,$match) = @$method; 

    print " - $name: ", $match->(), "\n"; 
    } 
} 

सूचना है कि स्ट्रिंग का उपयोग के रूप में है नकली मैचों उत्पादन कर सकता है:

 
$ ./try 
$_ = 'www.abc.com': 
    - as_is: MATCH 
    - qmeta: MATCH 
    - qe: MATCH 
$_ = 'www/abc!com': 
    - as_is: MATCH 
    - qmeta: NO MATCH 
    - qe: NO MATCH 

अविश्वसनीय इनपुट स्वीकार करने वाले कार्यक्रमों के लिए, नियमित अभिव्यक्तियों के रूप में ऐसी संभावित गंदे बिट्स का उपयोग करने के बारे में बेहद सावधान रहें: ऐसा करने से अप्रत्याशित रनटाइम त्रुटियां उत्पन्न हो सकती हैं, इनकार कर सकते हैं rvice भेद्यता, और सुरक्षा छेद।

+0

बिल्कुल सही! धन्यवाद gbacon! – James

+0

आपका स्वागत है! मुझे खुशी है कि यह मदद करता है। –

+0

अच्छा कोड ग्रेग! –

12

ऐसा करने का सबसे अच्छा तरीका है उद्धृत स्ट्रिंग और \E इसे समाप्त करने के लिए \Q का उपयोग करना है।

my $foo = 'www.abc.com'; 
$bar =~ /blah\Q$foo\Eblah/; 

तुम भी चर पर quotemeta पहले उपयोग कर सकते हैं। जैसे

my $quoted_foo = quotemeta($foo); 

\Q चाल के तहत perlre में प्रलेखित है "दृश्यों एस्केप।"

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