lex コマンドにおける拡張正規表現

lex 仕様ファイルで拡張正規表現を指定するのは、sed または ed コマンドで使用される方法と似ています。

拡張正規表現は、突き合わせる一組の文字列を指定します。 この式には、テキスト文字と演算子文字の両方が入っています。 テキスト文字は、 比較対照文字列内の対応する文字と突き合わせます。 演算子文字は繰り返し、選択、およびその他の機能を指定します。

数字とアルファベットの文字は、テキスト文字と見なされます。 例えば、拡張正規表現 integer は文字列 integer と突き合わせ、 式 a57D は文字列 a57D を探します。

演算子

次のリストは、拡張正規表現の指定に演算子をどのように使用するかを示しています。
Character
文字 文字 を突き合わせます。

例: a はリテラル文字の a を突き合わせ、b はリテラル文字の b を突き合わせ、 そして c はリテラル文字の c を突き合わせます。

"String"
引用符で囲まれた文字列を、文字列に演算子が使われている場合でも、突き合わせます。

例: lex コマンドが $ (ドル記号) を演算子と解釈しないように、 記号を引用符で囲みます。

¥文字 または ¥Digits
エスケープ文字。 文字列で使用する文字クラス演算子の前にある場合、 ¥ 文字はその演算記号が演算子でなくリテラル文字を表すことを示します。 有効なエスケープ・シーケンスは、以下のとおりです。
¥a
アラート
¥b
バックスペース
¥f
用紙送り
¥n
復帰改行文字 (式の中では、実際の復帰改行文字は使用しないでください。)
¥r
戻り
¥t
タブ
¥v
垂直タブ
¥¥
円記号
¥Digits
エンコードされると、Digits 文字列で指定された 1 桁、2 桁、または 3 桁の 8 進整数で表される文字。
¥xDigits
エンコードされると、Digits 文字列で指定された 16 進文字のシーケンスで表される文字。

¥ 文字が前述のエスケープ・シーケンスのリスト内にない文字の前にある場合、lex コマンドはそれをそのとおりに解釈します。

例: ¥c は未変更の文字 c と解釈され、[¥^abc] は文字 ^abc からなる文字クラスを表します。

注: lex コマンドで、¥0 または ¥x0 を決して使用しないでください。
[List]
囲まれた範囲 ([x-y]) または囲まれたリスト ([xyz]) の中の任意の 1 文字を、lex コマンドを呼び出したロケールに基づいて突き合わせます。 すべての演算記号 (下記を除く) は、大括弧式の中ではその特殊な意味を失います。 例外は、- (ダッシュ)、^ (脱字記号)、 および ¥ (円記号) です。

例: [abc-f] は、en_US ロケール内では abcde、または f を突き合わせます。

[:Class:]
[::] 区切り文字の間に指定されている文字クラスに属する文字を、 現行ロケールの LC_TYPE カテゴリー内の定義に従って突き合わせます。 以下の文字クラス名は、すべての地域でサポートされています。
alnum   cntrl  lower   space

alpha   digit   print  upper

blank  graph   punct   xdigit

lex コマンドは、ユーザー定義文字クラス名も認識します。 [::] 演算子が有効なのは、[] 式の中だけです。

例: [[:alpha:]] は、現行ロケール内の alpha 文字クラスの任意の文字を突き合わせますが、[:alpha:] は、:alp、および h の文字だけを突き合わせます。

[.CollatingSymbol .]
[..] 区切り文字の中に指定されている照合記号を 単一文字として突き合わせます。 [..] 演算子は、 [] 式の中だけで 有効です。 照合記号は、現行ロケールで有効な照合記号でなければなりません。

例: [[.ch.]] は、ch を一緒に突き合わせるのに対し、[ch]c または h を突き合わせます。

[=CollatingElement =]
[==] 区切り文字の中に指定されている照合エレメント およびその等価クラスに属するすべての照合エレメントを突き合わせます。 [==] 演算子は、 [] 式の中だけで有効です。

例: wv が同じ等価クラスに属する場合、 [[=w=]][wv] と同じで、w または v を突き合わせます。 w が等価クラスに属さない場合、[[=w=]]w だけを突き合わせます。

[^文字 ]
^ (脱字記号) の後の文字を除くすべての文字を突き合わせます。 結果として作成される文字クラスは、1 バイト文字だけで構成されます。 ^ シンボルの後の文字には、マルチバイト文字を使用してもかまいません。 しかし、 この演算子でマルチバイト文字を突き合わせる場合は、%h および %m を定義セクション内でゼロより大きく設定する必要があります。

例: [^c] は、c を除く任意の文字を突き合わせます。

CollatingElement -CollatingElement
文字クラス内で、現行ロケール用に定義される照合順序内の文字の範囲を示します。 範囲は、昇順にする必要があります。 範囲終了ポイントは、照合で範囲開始ポイントと等しいかまたはそれ以上でなければなりません。 この範囲は現行ロケールの照合順序に基づいているので、 lex コマンドが呼び出されたロケールによっては、 指定された範囲が異なる文字を突き合わせる場合もあります。
Expression?
? 演算子の直前にある式のゼロまたは 1 つのどちらかのオカレンスを突き合わせます。

例: ab?c は、ac または abc のどちらかを突き合わせます。

ピリオド文字 (.)
復帰改行文字を除く、任意の文字を突き合わせます。 ピリオド文字 (.) がマルチバイト文字を突き合わせるには、lex 仕様ファイルの定義セクションで、%z を 0 より大きく設定する必要があります。 %z が設定されない場合、ピリオド文字 (.) は 1 バイト文字だけを突き合わせます。
Expression*
* 演算子の直前にある式のゼロまたはそれ以上のオカレンスを突き合わせます。 例えば、a* は、 ゼロを含む任意の数の連続する a の文字です。 ゼロ・オカレンスの突き合わせの有用性は、複雑な式の場合は明らかです。

例: 式、[A-Za-z][A-Za-z0-9]* は先頭に英文字を持つすべての英数字の文字列を示し、 これには 1 文字の英文字だけの文字列も組み込まれます。 この式を、コンピューター言語における ID の認識のために使用することができます。

Expression+
+ 演算子の直前にあるパターンの 1 つまたはそれ以上のオカレンスを突き合わせます。

例: a+ は、a の 1 つ以上のインスタンスを突き合わせ、 また [a-z]+ は小文字から成るすべての文字列を突き合わせます。

Expression | Expression
| (パイプ) 演算子の前または後にある式の突き合わせを示します。

例: ab|cd は、ab または cd のどちらかを突き合わせます。

(Expression )
括弧の中の式を突き合わせます。 () (括弧) 演算子は、 グループ化に使用され、括弧の中の式を yytext 配列の中に読み込ませます。 括弧の中のグループは、他の任意のパターンの中の任意の単一文字の代わりに使用することができます。

例: (ab|cd+)?(ef)* は、 abefefefefefcdef、 または cddd などの文字列を突き合わせますが、abcabcd、または abcdef は突き合わせません。

^Expression
Expression が行の先頭にある場合にだけ一致することを示します。^ (脱字記号) 演算子を表現の最初に置きます。

例: ^h は、 行の先頭にある h を突き合わせます。

Expression$
Expression が行の末尾にある場合にだけ一致することを示します。$ (ドル記号) 演算子を表現の最後に置きます。

例: h$ は、行末にある h を突き合わせます。

Expression1 /Expression2
Expression2Expression1 のすぐ後に続いている場合だけ、突き合わせることを示します。 / (スラッシュ) 演算子は、 最初の式だけを yytext 配列に読み込みます。

例: ab/cd は、 文字列 ab を、その後に cd が続いた場合のみ突き合わせます。 その後、abyytext 配列に読みこみます。

注: 単一の拡張正規表現で使用できる 末尾コンテキスト演算子 / は 1 つだけです。 ^ (脱字記号) と $ (ドル記号) の演算子は、 末尾文脈の特殊なケースを示すので、/ 演算子と同じ式で使用することはできません。
{DefinedName }
定義セクションで名前を定義したときに、名前を突き合わせます。

例: D を数値桁として定義した場合、 {D} はすべての数値桁を突き合わせます。

{Number1,Number2 }
その直前のパターンの Number1 から Number2 のオカレンスを突き合わせます。 式 {Number} および {Number,} も可能で、式の前にあるパターンの Number 個のオカレンスを突き合わせます。

例: xyz{2,4} は、xyzxyz、xyzxyzxyz、または xyzxyzxyzxyz と一致します。 これは、+* および ? の演算子とは異なります。 これらの演算子の場合は、その直前の文字だけと一致します。 間隔式の直前の文字だけを一致させるには、グループ化演算子を使用します。 例えば、xy(z{2,4}) は xyzz、 xyzzz または xyzzzz と一致します。

<StartCondition>
字句解析プログラムが指定された開始条件である場合だけ、 関連したアクションを実行します。

例: 行の始まりに開始条件 ONE がある場合、^ (脱字記号) 演算子は式 <ONE> に等しくなります。

演算子の文字をテキストの文字として使用する場合は、 エスケープ・シーケンスの "" (二重引用符) または ¥ (円記号) の中の 1 つを使用します。 " " 演算子は、 囲まれているものがテキストであることを示します。 したがって、次の例は文字列 xyz++ と一致します。

xyz"++"

文字列の一部を引用符で囲むことができます。 通常、テキストの文字を引用符で囲んでも効果はありません。 例えば、次の式は前の例と同じです。

"xyz++"

テキストがテキストとして解釈されるようにするには、英字または数字でないすべての文字を引用符で囲んでください。

演算子文字をテキスト文字に変換するもう 1 つの方法は、¥ (円記号) 文字を演算子文字の前に置きます。 例えば、次の式は前の例と同じです。
xyz¥+¥+