regexen の正規表現は、どこかでミームに違いありません。とにかくやってみましょう。
gawk 正規表現は次のもので構成されます。
正規表現コンポーネント (簡略化された形式 -- 注 1) は、次のいずれかです。
ここまでは簡単です。さて、楽しい部分です。
文字クラスは次のとおりです。
[
または[^
または[]
または[^]
(注2)
任意の数の文字クラス コンポーネント
]
文字クラスのコンポーネントは (理論的には、ただし gawk のバグについては以下を参照)、次のいずれかです。
]
or以外の任意の 1 文字\
(注 3)
a の\
後に任意の 1 文字が続く
文字クラス
照合クラス
文字クラスは次のとおりです: (注 5)
照合クラスはほとんど実装されていませんが、部分的に解析されています。gawk はまだそれらを正しく理解していないように見えるので、おそらくそれらを無視することができます (注 4)。しかし、それだけの価値があります:
または等価クラス:
重要な点は、正規表現を終了[/]
しないことです。書く必要はありません[\/]
。(それを実装するために何もする必要はありません。私はそれについて言及しているだけです。)
注 1:
実際には、\
および 文字クラスの解釈は、それらに到達すると、はるかに複雑になります。私は字句解析のために十分に説明しているだけです。実際に正規表現を断片に解析したい場合は、もっとイライラします。
たとえば、 or を使用して任意のオクテットを指定できます\ddd
(\xHH
例: \203
or \x4F
)。ただし、エスケープ シーケンスには特別なものはなく、字句解析の目的では問題にならないため、気にする必要はありません。語彙素の右端を取得します。-
同様に、文字範囲や文字クラス内の特殊なルールについても説明しませんでした。また、正規表現のメタ文字についてもまったく心配(){}?*+.
しませんでした。正規表現の終了[]
を暗黙的に隠すことができるため、心配する必要があります。/
(私はかつて、/
括弧で囲まれた式の中に隠すことができる正規表現パーサーを書きましたが、これはクールだと思いました。(\/)
-- しかし、これが良い考えだとは誰も考えていないようです。)
注 2:
gawk は\
文字クラス内で間違った動作をしますが (以下の注 3 を参照)、それらを使用する必要はないため、引き続き Posix の動作を使用できます。Posix の動作は、]
が文字クラスの最初の文字である場合、文字クラスを終了しないこと^
です。これに対処する最も簡単な方法は、次のように要約される 4 つの可能なシーケンスのいずれかで文字クラスを開始させることです。
\[^?]?
注3:
\
gawk は、文字クラス内をエスケープ文字として解釈するという点で、Posix ERE (拡張正規表現) とは異なります。\
文字クラス内での特別な意味を失う Posix 命令。gawk がこれを行うのは面倒だと思います (他の多くの正規表現ライブラリも同じように迷惑です)。 gawk の情報マニュアルで、Posix ではこれを行う必要があると書かれているのに、実際にはその逆が必要なのが特に厄介です。しかし、それは私だけです。とにかく、gawkで:
/[\]/]/
]
または のいずれかに一致する正規表現/
です。Posix では、囲んでいる s を取り除くと、 a の後に aが続き、 aが続く/
正規表現になります。(gawk と Posix の両方で、それが文字クラス ターミネータとして扱われていない場合は、特別ではないことが要求されます。)\
/
]
]
注 4:
私のマシンにインストールされている gawk のバージョンには、照合クラスの最後で正規表現パーサーが混乱するというバグがあります。したがって、正規表現は次の最初の 1 秒で終了すると考え/
られます。
/[[.a.]/]/
これは正しくなりますが:
/[[:alpha:]/]/
もちろん、スラッシュを最初に置くと常に機能します。
/[/[:alpha:]]/
注 5:
文字クラスと照合クラスとその仲間は、2 文字のターミネータがあるため、解析が少し難しくなります。「C の /* */ コメントを認識する正規表現を記述してください」は、以前は標準的なインタビューの質問でしたが、もはやそうではないと思います。とにかく、ここに解決策があります([:...:]の場合ですが、必要に応じて他の句読点を : に置き換えてください):
[[]:([^:]|:*[^]:])*:+[]] // Yes, I know it's unreadable. Stare at it a while.