HN 日本語サマリー

← 一覧へ戻る
プログラミング

どこでも機能する正規表現

Regular expressions that work "everywhere" (johndcook.com)

79 pointsby ColinWright31 コメント

要約

正規表現の実装はツールによって異なり、それがフラストレーションの原因となることがあります。この記事では、sed、awk、grep、Emacsといった一般的なツールで「どこでも」機能する正規表現の共通部分について解説しています。特にawkの正規表現が低共通分母として機能し、Emacsは特殊なバックスラッシュの扱いを必要とすることなどを指摘し、多くの環境で使える正規表現の機能セットを提案しています。

全文翻訳

正規表現の最も不満な点は、その実装がツールによって異なることです。あるツールでサポートされている機能が、別のツールでは全くサポートされていなかったり、わずかに異なる構文でサポートされていたりすることがあります。私はPerlの文脈で正規表現を学びましたが、Perlは最大限の正規表現環境です。これにより、期待する機能が利用できない場合に不満を感じました[1]。これを回避する一つの方法は、他のツールのPerlアナログを使用することですが、これは非常に非標準的です。私は同僚やクライアントに、箱から出してすぐに使えるコードを送りたいのです。計算サバイバル主義に関する私の投稿で述べたように、私はソフトウェアをインストールできないコンピューターで作業する必要があることが時々あります。したがって、より良いアプローチは、「どこでも」機能する正規表現機能のサブセットを特定することです。「どこでも」の定義が厳しくなればなるほど、含まれるものは少なくなります。最も厳密なサブセットは、リテラル文字クラス [...]、特殊文字 . * ^ $ です。 「どこでも」のより緩やかな定義は、最も重視するツールになります。現在、私が正規表現で最も使いたいツールは、sed、awk、grep、Emacsです。 Awkを最低共通分母として Gnu版のsed、awk、grepを使用し、sedとgrepで-Eオプションを使用すると、共通機能のリストは大きくなります。これら3つのツールの正規表現機能は似ており、awkの機能は他のツールでもサポートされていますが、1つ例外があります: awkの単語境界は\<と\>であり、\bと\Bではありません。Awkの正規表現機能については、ここで書きました。 Emacsを異端者として Emacsはawkの正規表現機能のほとんどに対応しています。ただし、文字+ ? ( ) { } |は、awkの対応する機能として機能させるためには、すべて前にバックスラッシュが必要です。また、awkの\sと\Sに相当するものは、Emacsでは\s-と\S-です。Emacsでは、\sと\Sはスペースまたは非スペースを意味するのではなく、(否定された)文字クラスを開始し、そのクラスの1つがスペースの-です。しかし、他にも多くのものがあります。例えば、\s.は句読点文字を表し、\S.は非句読点文字を表します。 どこでも機能するもの したがって、私の「どこでも」の定義では、上記の注意点を除けば、以下の機能がどこでも機能します。YMMV。 . ^, $ […], [^…] * \w, \W, \s, \S \1 - \9 (後方参照) \b \B ? + | (選択) {n,m} (繰り返しカウント) (...) (キャプチャ) 1つの注意点として、gawkは置換文字列で後方参照をサポートしますが、正規表現自体ではサポートしません。[1] ある程度は、Perlの基本的な機能は他の場所でも機能しますが、高度な機能は機能しません。これは、何が基本で何が高度かというあなたの考えによります。私はルックアラウンド機能を高度だと考えており、それは追跡可能です。しかし、数字の\dを基本だと考えていますが、多くの正規表現フレーバーではサポートされていません。