= パターンマッチング記法
:encoding: UTF-8
:lang: ja
//:title: Yash マニュアル - パターンマッチング記法
:description: Yash がサポートするパターンマッチング記法について

dfn:[パターンマッチング記法]は特定の文字列の集合を表すdfn:[パターン]の書式と意味の定義です。ある文字列があるパターンの表す文字列の集合に含まれる時、その文字列はそのパターンにdfn:[マッチする]といいます。文字列がパターンに当てはまるかどうかは、以下に示す定義に従って判定されます。

[[normal]]
== 通常の文字

link:syntax.html#quotes[クォート]してある文字および以下に示す特殊な意味を持つ文字以外のすべての文字は、通常の文字として扱われます。パターンに含まれる通常の文字は、その文字自身に当てはまります。

例えば +abc+ というパターンは +abc+ という文字列に当てはまります。(そしてこれ以外の文字列には一切当てはまりません)

[[single]]
== 一文字ワイルドカード

文字 +?+ は任意の一文字に当てはまります。

例えば +a?c+ というパターンは ++aac++、++abc++、++a;c++ など、+a+ で始まり +c+ で終わる任意の 3 文字の文字列に当てはまります。

[[multiple]]
== 複数文字ワイルドカード

文字 +*+ は任意の文字列に当てはまります。ここでいう任意の文字列には空文字列も含まれます。
例えば +a*c+ というパターンは ++ac++、++abc++、++a;xyz;c++ など、+a+ で始まり +c+ で終わる任意の文字列に当てはまります。

[[bracket]]
== ブラケット記法

括弧 +[+ と +]+ で囲まれた部分はdfn:[ブラケット記法]とみなされます。ただし、括弧の間には少なくとも一文字挟まれている必要があります。括弧の間にある文字は以下に示すブラケット記法のための特殊なパターン (dfn:[ブラケット記法パターン]) として解釈されます。ブラケット記法は、括弧の間にあるブラケット記法パターンが示す文字のどれか一つに当てはまります。

最初の括弧 +[+ の直後に記号 +!+ がある場合、ブラケット記法に当てはまる文字と当てはまらない文字とが逆転します (そしてこの +!+ はブラケット記法パターンの一部とはみなされません)。Yash では +[+ の直後に +&#x5E;+ がある場合も同様に当てはまる文字と当てはまらない文字とが逆転します (が、他のシェルでは +&#x5E;+ の扱いが異なることもあります)。

最初の括弧 +[+ の直後 (あるいは上述の +!+ または +^+ がある場合はその直後) に括弧 +]+ がある場合は、それはブラケット記法の終わりを示す括弧としてではなくブラケット記法パターンの一部とみなされます。ブラケット記法パターンの解釈はlink:syntax.html#quotes[クォート]の処理の後に行われるので、クォートによってブラケット記法パターン内の文字を通常の文字として扱わせることはできません。

パターンの中に +[+ が含まれていても、それが正しいブラケット記法の形式になっていない場合は、その +[+ はブラケット記法ではなく通常の文字として扱われます。

[[bra-normal]]
== (ブラケット記法パターンにおける) 通常の文字

以下に示す特殊な意味を持つ記号以外の文字はすべて通常の文字として扱われます。通常の文字はその文字自身を表します。

例えば +[abc]+ というブラケット記法は ++a++、++b++、++c++ のどれかの文字に当てはまります。従って +a[abc]c+ というパターンは ++aac++、++abc++、++acc++ という三つの文字列に当てはまります (そしてこれ以外の文字列には当てはまりません)。

[[bra-range]]
== 範囲指定

二つの文字 (または<<bra-colsym,照合シンボル>>) をハイフン (+-+) でつないだものはdfn:[範囲指定]とみなされます。範囲指定は、その二つの文字と照合順序上その間にある全ての文字を表します。dfn:[照合順序]とは文字を辞書順に並べるためにロケールデータに定義される文字の順序関係です。使用中のロケールに定義されている照合順序に従って二つの文字の間にある文字が決まります。

ハイフンの後に +]+ を置いた場合は、この +]+ はブラケット記法の終わりを示す括弧とみなされ、ハイフンは通常の文字として扱われます。

例えば +[1-5]+ というブラケット記法は ++1++、++2++、++3++、++4++、++5++ という五つの文字のどれか一つに当てはまります。

[[bra-colsym]]
== 照合シンボル

dfn:[照合シンボル]を用いることで複数の文字からなる照合要素を一つの文字として扱うことができます。(dfn:[照合要素]とは複数の文字をまとめて一つの文字として扱うことができるようにするために考えられた、より一般的な文字の概念です。パターンマッチングにおいて全ての文字は実際には照合要素として扱われています。) 照合シンボルは括弧 +[. .]+ の中に照合要素を挟んだものとして表します。括弧内に書ける照合要素は使用中のロケールデータにおいて照合要素として登録されているものに限ります。

例えば従来スペイン語では ``ch'' という二文字を合わせて一文字として扱っていました。この二文字の組み合わせが照合要素としてロケールに登録されているならば、++[[.ch.]df]++ というブラケット記法は ++ch++、++d++、++f++ のどれかに当てはまります。もしここで +[chdf]+ というブラケット記法を使うと、これは ++c++、++h++、++d++、++f++ のどれかに当てはまり、++ch++ には当てはまりません。

[[bra-eqclass]]
== 等価クラス

等価クラスを用いることで、ある文字と__等価__であるとみなされる文字を指定することができます。等価クラスは括弧 +[= =]+ の中に文字を挟んだものとして表します。括弧の間には照合シンボルのように複数の文字からなる照合要素を書くこともできます (上記参照)。等価クラスは、括弧で挟んだ文字そのものの他に、その文字と同じ第一等価クラスに属する全ての文字を表します。どの文字が第一等価クラスに属するかの定義は使用中のロケールデータに従います。

例えばロケールデータにおいて a, à, á, â, ã, ä の 6 文字が同じ第一等価クラスに属すると定義されているとき、+[[=a=]]+ というブラケット記法はこれら六つの文字のどれか一つに当てはまります。+[[=à=]]+ や +[[=á=]]+ も同様です。

[[bra-chclass]]
== 文字クラス

dfn:[文字クラス]は特定の種類の文字の集合を表します。文字クラスは括弧 +[: :]+ の間に文字クラスの名前を囲んだものとして表します。文字クラスの名前としては、以下に挙げる共通の文字クラスの他に、使用中のロケールで定義された独自の文字クラスが使用できます。いずれの文字クラスの場合も、文字クラスにどの文字が含まれるのかは使用中のロケールにおける文字クラスの定義に従います。

+[:lower:]+::
小文字の集合
+[:upper:]+::
大文字の集合
+[:alpha:]+::
アルファベットの集合 (+[:lower:]+ と +[:upper:]+ を含む)
+[:digit:]+::
十進法の数字の集合
+[:xdigit:]+::
十六進法の数字の集合
+[:alnum:]+::
アルファベットと数字の集合 (+[:alpha:]+ と +[:digit:]+ を含む)
+[:blank:]+::
空白文字の集合 (改行を含まない)
+[:space:]+::
空白文字の集合 (改行等を含む)
+[:punct:]+::
句読点等の集合
+[:print:]+::
表示可能な文字の集合
+[:cntrl:]+::
制御文字の集合

例えば `[[:lower:][:upper:]]` というブラケット記法は一文字の小文字または大文字に当てはまります。

// vim: set filetype=asciidoc expandtab:
