1

正規表現では、一部の文字は、適切に配置された場合にのみメタ文字の特別な意味を取得し、それ以外の場合は文字通りの意味を維持します。たとえば、文字は角括弧式内に配置され、文字通りダッシュの外側にある-場合にのみメタ文字として扱われます。[]

しかし、個人的には、メタ文字を予約文字と同じように考え、リテラルである必要があるすべてのメタ文字をエスケープするという厳密なルールを採用するのが好きです。これにより、メタ文字が正規表現のどこにあるかを検討するために費やされる時間を少し節約できます。

しかし、私が知っていることから、そのような文字をエスケープすることは通常、GNUBREのエラーです。そしてこの正規表現

foo\-[0-9]+

\-RegexBuddyによってその部分が無効と見なされます。さらに、RegexBuddyは、GNU EREで同じエラーを示します(PCREではありません)。一方、grepUbuntuでは、この正規表現はエラーとして扱われず、grepデフォルトでEREを使用することになっているにもかかわらず、私のテストでは正常に機能します。

したがって、BREとRegexBuddyを脇に置いて、現在の多くのシステムとプログラミング言語で使用されているPCREとEREだけを考えると、問題は、文字通りの意味を得るためにすべての可能なメタ文字をエスケープすることに慣れることがどれほど間違っているかということです。

4

3 に答える 3

3

ここではPCREにしか答えられません。PCREでは、好きなだけ逃げることができ、違いはありません。エスケープシーケンスに関するPHPのPCREドキュメントの引用:

[...] [バックスラッシュ]の後に英数字以外の文字が続く場合、その文字が持つ可能性のある特別な意味を取り除きます。

私は「持っているかもしれない」を「意味がなくてもかまわない」と解釈します。そして、私はあなたの与えられた例でそれをテストしました、そして問題はありません。


使用中の正規表現エンジンに関係なく、一般的な注意事項:

安全のために常にすべてを逃れるのは良い考えのように思えますが、少なくとも一度は読みやすさの影響について意識的に考える必要があります。正規表現はとにかく読みにくくなる傾向があり、不要な円記号でそれらを乱雑にすることは実際にはこれを改善しません。特に、キャラクタークラス内では、キャラクタークラス内のメタキャラクターであるキャラクターのみをエスケープします(個人的には、エスケープする必要のない特定の位置に移動することを好みますが[a-zA-Z0-9_-]、一部の人々はそれを好きではありません)。これには素晴らしい副作用があります。(私の意見では)文字クラスの外側ではあるが内部ではないメタ文字である文字をエスケープするための(私の意見では)より読みやすい代替手段として、文字クラスを使用できます。だからあなたは書くことができます[|]の代わりに\|またはの[.]代わりに\.。等幅フォントでは、この1文字の文字クラスは、単一の要素として簡単に認識できる素敵な正方形を作成し、重要な文字はその中央にあります(\.重要な文字では、「それが理にかなっている場合は、複合単一文字」)。また、エスケープされていない括弧の近くで括弧をエスケープすることになると、文字クラスのエスケープがはるかに読みやすくなり(\()(\))ます([(])([)])。もちろん、それも好みの問題です。ただし、正規表現のエスケープ規則を設定する際には、検討する価値があります。

于 2012-12-02T12:44:33.077 に答える
2

「すべてのメタ文字をエスケープする」ことができるかどうかを尋ねるのではなく、「メタ文字かどうかわからないすべての文字をエスケープする」ことができます。文字や数字以外のすべてをエスケープしたいようです。

機能のエラーではありませんが、次のようになります。

  • コードが読みにくくなります。文字が少ないほど良いです。
  • それはあなたの後に来るプログラマーに、なぜあなたが不必要に文字をエスケープしているのか疑問に思い、あなたのコードについて何が違うのか、そしてあなたが回避しようとしている問題を理解しようと時間を費やすようにします。
  • そのプログラマーは、あなたがメタ文字以外の文字を逃げているだけだと最終的に理解すると、あなたは無能なプログラマーだと思います。

あなたのツールを学び、それらを適切に使用することを学び、そしてあなたの知識の欠如を回避するためにブードゥーのトリックを使用しないでください。

于 2012-12-02T15:37:17.953 に答える
0

POSIX正規表現またはPCREについてはわかりませんが、Perlでは、すべてのバックスラッシュされた非単語文字がそれ自体と一致することが保証されています。詳細perldoc -f quotemetaはをご覧ください。

于 2012-12-02T12:45:47.727 に答える