2011-09-14 22 views
6

私はPerlで正規表現にマッチさせようとしています。 Perlの正規表現に一致するようにしようとしたときPerl正規表現で特殊文字をエスケープする

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

問題は、ブラケットは文字クラスを示していることで発生する(またはので、私は読んで)、そしてマッチが失敗して終わる:私のコードは次のようになります。私は\[または\]で角括弧を逃れることができますが、それは文字列を通って角括弧を検索するためには別のコードブロックが必要になることを知っています。角括弧を個別にエスケープせずに自動的に無視する方法はありますか?

クイックメモ:バックスラッシュを追加することはできません。これは単なる例です。私の実際のコードでは、$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 index()を使用する場合 – sln

+0

"正規表現の文字"とは何ですか?私は認識していない別の意味がない限り、正規表現は文字列内の文字列やパターンを特定の文字セットではなく一致させる手段に過ぎないという印象を受けましたか? index()がありがとうございます。私は明日私のサーバーにいるときにそれを撃つだろう。私はindex()が正常に動作し、正規表現マッチングよりもきれいであると思う。 – CoV

+0

"regex character"はタイプミスで、私は "regex metacharacter"と書いていました。 – tadmc

11

使用quotemeta()\Eが見つかったり、パターンの終わりされるまで

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

\Qはメタキャラクタを無効にします。そのリテラル知られており、実際の正規表現にダンプされるように使用されていない限り$pattern敗北正規表現の目的を引用

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

編集
そうでない場合は、単にストリングの位置を見つけるためにindex()を使用しています。その情報を使用して、必要に応じて周囲のデータを抽出するのにsubstr()を使用してください。

+0

何のためにsubstr()を使用していますか? – tadmc

+0

私はindex()を使用してget()メソッドを呼び出すことになりましたが、私は "受け入れられた答え"、申し訳ありませんでした。 position、substr()(オプション)を使用して残差データを抽出します。 – sln

0

です。

expression1 = '$%()'のような特殊文字を含むテキスト。

式1 =〜s/[\?* + \^\ $ [] {(} {} | |]/"\ $ &" !これは、すべての特殊文字に

印刷「式1' エスケープします

;!\ $ \%などの特殊文字()

関連する問題