1

AWK ソース コードを解析するためのフレックス スキャナーの最後のパターンをまとめています。

以下に示すように、AWK ソース コードで使用されている正規表現を一致させる方法がわかりません。

{if ($0 ~ /^\/\// ){ #Match for "//" (Comment)

またはもっと簡単に:

else if ($0 ~ /^Department/){

ここで、AWK 正規表現は「/ /」でカプセル化されています。

これまでに試したすべての Flex パターンは、入力ファイル全体と一致します。正規表現パターンの優先順位を変更しようとしましたが、うまくいきませんでした。助けていただければ幸いです!!

4

2 に答える 2

2

regexen の正規表現は、どこかでミームに違いありません。とにかくやってみましょう。

gawk 正規表現は次のもので構成されます。

  • /

  • 任意の数の正規表現コンポーネント

  • /

正規表現コンポーネント (簡略化された形式 -- 注 1) は、次のいずれかです。

  • 以外の任意の文字/[または\

  • a の\後に任意の 1 文字が続きます (ただし、今は改行については説明しません。

  • 文字クラス (下記参照)

ここまでは簡単です。さて、楽しい部分です。

文字クラスは次のとおりです。

  • [または[^または[]または[^] (注2)

  • 任意の数の文字クラス コンポーネント

  • ]

文字クラスのコンポーネントは (理論的には、ただし gawk のバグについては以下を参照)、次のいずれかです。

  • ]or以外の任意の 1 文字\(注 3)

  • a の\後に任意の 1 文字が続く

  • 文字クラス

  • 照合クラス

文字クラスは次のとおりです: (注 5)

  • [:

  • 有効なクラス名です。これは常にアルファ文字のシーケンスですが、仮定をしない方が安全かもしれません。

  • :]

照合クラスはほとんど実装されていませんが、部分的に解析されています。gawk はまだそれらを正しく理解していないように見えるので、おそらくそれらを無視することができます (注 4)。しかし、それだけの価値があります:

  • [.

  • オランダのロケールの「ij」のような複数文字の照合文字(私は思う)。

  • .]

または等価クラス:

  • [=

  • 一部の文字、または複数文字の照合文字

  • =]

重要な点は、正規表現を終了[/]しないことです。書く必要はありません[\/]。(それを実装するために何もする必要はありません。私はそれについて言及しているだけです。)


注 1:

実際には、\および 文字クラスの解釈は、それらに到達すると、はるかに複雑になります。私は字句解析のために十分に説明しているだけです。実際に正規表現を断片に解析したい場合は、もっとイライラします。

たとえば、 or を使用して任意のオクテットを指定できます\ddd(\xHH例: \203or \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.
于 2012-09-25T04:40:14.187 に答える
0

正規表現は「/.../」がなくても機能する可能性があります。例を参照してください。

print all numbers starting with 7 from 1-100:

kent$  seq 100|awk '{if($0~"7[0-9]")print}'
70
71
72
73
74
75
76
77
78
79

kent$  awk --version
GNU Awk 3.1.6
于 2012-09-25T09:07:52.283 に答える