web-dev-qa-db-ja.com

正規表現でエスケープする必要があるリテラル文字は何ですか?

Php関数で使用する正規表現を作成しましたpreg_match次の部分が含まれています。

[\w-.]

任意のWord文字、およびマイナス記号とドットに一致します。 preg_matchで機能しているように見えますが、 Reggy というユーティリティに入れようとしましたが、 "charクラスの範囲が空です"。試行錯誤の結果、この問題はマイナス記号をエスケープし、正規表現を次のように変換することで解決されたことがわかりました。

[\w\-.]

オリジナルはPHPで機能しているように見えるので、マイナス記号をエスケープする必要があるのか​​、エスケープしないのか疑問に思います。また、ドットはPHP)で意味を持つ文字でもあるため、なぜドットをエスケープする必要はありません。私が使用しているユーティリティはばかげているだけですか、それは別の正規表現方言で動作していますか、それとも私の正規表現は本当に間違っていますか?preg_matchでそれを回避できるのは幸運ですか?

24
The Pellmeister
[\w.-]
  • .は通常任意の文字を意味しますが、[]の間には特別な意味はありません
  • -間の[]は、エスケープされているか、[]間の最初または最後の文字である場合を除いて範囲を示します。
6
bw_üezi

確かに 一部の文字は正規表現でエスケープする必要があります がありますが、正規表現ではなく文字クラスについて質問しています。ダッシュ記号は特別なものです。

エスケープする代わりに、クラスの最後に置くことができます、[\w.-]

4

ピリオドは、文字クラスでのメタ意味を失います。

-は、文字クラスで特別な意味を持ちます。角括弧の先頭または末尾に配置されていない場合は、エスケープする必要があります。それ以外の場合は、文字範囲(A-Z)を示します。

あなたがトリガーした別の特殊なケースしかし。 [\w-.]は単一の文字を示さないため、\wは機能します。そのため、PCREは文字範囲を作成できない可能性があります。 \wは、おそらく一貫性のないクラスのシンボルであるため、範囲Z till .を作成するために使用できる終了文字はありません。また、ピリオド.は、\wが一致する可能性のある最初のASCII文字aの前にあります。構築可能な範囲はありません。したがって、なぜ-はあなたのために逃げることなく働いたのですか。

3
mario

Phpを使用していて、特別な正規表現文字をエスケープする必要がある場合は、preg_quoteを使用してください。

php.net からの例:

<?php
// In this example, preg_quote($Word) is used to keep the
// asterisks from having special meaning to the regular
// expression.

$textbody = "This book is *very* difficult to find.";
$Word = "*very*";
$textbody = preg_replace ("/" . preg_quote($Word, '/') . "/",
                          "<i>" . $Word . "</i>",
                          $textbody);
?>
0
RedClover