2011-09-14 121 views
6

我想在Perl中匹配正則表達式。我的代碼如下所示:在Perl正則表達式中轉義特殊字符

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

問題出現在括號表示一個字符類(或讓我讀)時的Perl嘗試匹配正則表達式,而比賽結束以失敗告終。我知道我可以使用\[\]來避開括號,但是這需要另一個代碼塊來瀏覽字符串並搜索括號。有沒有辦法讓括號自動忽略而不單獨逃脫?

快速提示:我不能只添加反斜槓,因爲這只是一個例子。在我的真實代碼中,$source$pattern都來自Perl代碼之外(URIEncoded或文件)。

回答

10

您正在使用錯誤的工具進行工作。

你沒有模式! $ pattern中沒有正則表達式 !

你有一個文字字符串。

指數()是與文本字符串的工作...

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

+1使用索引() – sln

+0

究竟是什麼「正則表達式字符」?我的印象是,正則表達式只是匹配字符串中的字符串或模式的一種手段,而不是一組特定的字符,除非我還沒有意識到另一種含義。 雖然,感謝索引()。當我明天在我的服務器上時,我會給你一個鏡頭;我確實認爲index()會比正則表達式匹配更好,更清晰。 – 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負正則表達式的目的,除非其被用作一個已知的字面和被傾倒成真正的正則表達式。

編輯
否則,只用index()找到子串的位置。有了這些信息,只需要使用substr()來提取周圍的數據。

+0

使用substr()什麼? – tadmc

+0

我會使用索引()位置,然後substr()(可選)提取殘差數據。 – sln

0

您可以在表達使用下面的命令轉義設置的特殊字符。 ''具有特殊字符(例如$%()')的文本';表達式1 =〜s/[\ * * \ \^\ $ [] \(){} \ | - - ] /「\ $ &」/ eg;

這將轉義所有特殊字符

打印「表達式' ;!與像\ $ \%特殊字符()