2016-04-18 8 views
1

私は次のことを実行しましたエラーました:私は、行の末尾に]をエスケープすることにより、エラーを解決しなぜ私の正規表現で `]`をエスケープする必要がありますか?

Unmatched [ in regex; marked by <-- HERE in m/[A-G][ <-- HERE \d|\s|m|#|5.022001/ at -e line 1, <> line 1 

perl -ne 'print unless (/[A-G][\d|\s|m|#|$\]/)' file 

perl -ne 'print unless (/[A-G][\d|\s|m|#|$]/)' file 

エラーを

なぜ私は最後に]をエスケープしなければなりませんでしたか?ブラケットがマッチしないようにするには?

これはすべての[]の一致では当てはまりません。これは特殊なケースですか?

+2

: - それは 'でなければなりません(\ D | \ sの| M |#| $)' .. – rock321987

+0

@ anubhavaええ、それも可能です.OMGあまりにもダムだった – rock321987

+0

@ rock321987思い出してくれてありがとう。私はどこが間違っているか理解しています! –

答えて

4
perl -ne 'print unless (/[A-G][\d|\s|m|#|$]/)' file 

のために使用される特別な変数であるので、そこにエスケープする必要があります$だと思いますPerlの

しかし、正規表現はあまり意味がありません。それのこの部分で:

[\d|\s|m|#|$] 

[]間のテキストは、文字または文字の範囲のシーケンスであり、そして式はこれらの文字のいずれかと一致します。 'または '$' 文字| ''、 'S'、 'D'、

[\d|\s|m|#|\$] 

は、単一のバックスラッシュを一致させるために起こっている意味M」、' $:バックスラッシュを追加します。 (私は詳細約100%確実ではないです。)あなたはおそらくしたい:

(\d|\s|m|#|$) 

あなたは$1に保存されている一致するテキストたくない場合ことを微調整することができます。

(?:\d|\s|m|#|$) 

をそれですおそらくこの1つのライナーのために価値がない。

また、外側のかっこは必要ありません。あなたはおそらくが望むものを、すべて一緒にこれを置くことである:私はあなたがここで間違っているかと思います

perl -ne 'print unless /[A-G](\d|\s|m|#|$)/' file 
+1

'$)'も変数ですが、regexパーサはそれを考慮しないようにコード化されています。 – ikegami

+0

'(\ d | \ s | m |#| $)'は '$'が "end of string"と一致すると仮定します。 '$'に '$'をマッチさせるには '[\ d \ sm#\ $]'を使います。 – ikegami

7

私はそれが$]はどうやら$]は、現在のバージョンが含まれている$]変数としてはPerlによって解釈されているThe revision, version, and subversion of the Perl interpreter

+0

'$'を使って行末の文字を示しました。 '$'をエスケープすれば、それはまだ行末を表しますか? –

+0

はい、しかし、ただ1つのことを修正すれば、正規表現はそれほど意味がありません。 –

+1

@OneFace括弧内の文字クラスでは、 '$'はリテラルドル記号を意味します。 – ThisSuitIsBlackNot

関連する問題