ワイルドカードは、トランプのジョーカーに似ています。「?」や「*」の記号を用いることで、あらゆる文字を表すことができるのです。一般的には、ファイルを検索するときや、データベースを検索するときに使います。
例えば、ファイルを検索するときに、「*.txt」を検索すると、「aaa.txt」や「bbb.txt」、「ccc.txt」など、ワイルドカードのパターンに一致したファイルを検索結果として取り出すことができます。
ワイルドカードの意味としては、「*」が任意の複数文字、「?」が任意の1文字を表します。
ですので、「no?.txt」を検索すれば、「no1.txt」、「no2.txt」、「no3.txt」などが取り出されます。
なでしこで、ある文字列が、ワイルドカードのパターンに一致するかどうか調べるには、『ワイルドカード一致』という命令を使います。
以下は、ワイルドカードのパターンを「*.doc」にして、ファイル一覧から一つずつパターンに一致するかどうか調べるプログラムです。
プログラム:一致.nako
パターンは「*.doc」
ファイル一覧は「2005年顧客名簿.xls
2006年顧客名簿.xls
2005年決算報告.doc
2006年決算報告.doc」
ファイル一覧を反復
対象がパターンにワイルドカード一致するか。
もし、それがはいならば、対象を表示。
これを実行すると、".doc"の拡張子を持つ以下の2つが表示されます。
次に「2005年*」というパターンで調べてみます。
プログラム:一致2.nako
パターンは「2005*」
ファイル一覧は「2005年顧客名簿.xls
2006年顧客名簿.xls
2005年決算報告.doc
2006年決算報告.doc」
ファイル一覧を反復
対象がパターンにワイルドカード一致するか。
もし、それがはいならば、対象を表示。
これを実行すると、以下のように2005年から始まるファイルが表示されます。
このように、ワイルドカードを使うと、そのパターンに合うものだけを取り出すことができるので、とても便利です。
なでしこで使えるワイルドカードをまとめたのが以下の表です。
パターン | 意味 |
* | 任意の0文字以上の文字列 |
? | 任意の1文字 |
# | 任意の数字1字 |
[str] | strに指定した文字列のうちのどれか1文字 |
[!str] | strに指定した文字列以外の1文字 |
[*str] | strのどれか1文字の0回以上の繰り返し |
[+str] | strのどれか1文字の1回以上の繰り返し |
[=a|b] | 文字列aかbのどちらか |
[*!str] | str以外の0回以上の繰り返し |
[+!str] | str以外の1回以上の繰り返し |
\ | シーケンス文字。\tでタブ、\nで改行、\[で[の意味 |
(str) | strに一致する部分を別途抽出する |
※VBのLikeでは、上の"*"から"[!str]"までが使えます。
それでは、上で解説しなかった部分を解説します。
『#』は任意の数字1字を表します。郵便番号などが正しく入力されたか調べるのに便利でしょう。
以下のプログラムは、郵便番号を尋ね、入力された形式が、「###-####」のパターンにあてはまるか確認する例です。
プログラム:郵便番号チェック.nako
「郵便番号は?(###-####)」と尋ねる。
郵便番号は、それ。
郵便番号を「###-####」でワイルドカード一致。
もし、それがはいならば
「正しく入力されました」と言う
違えば
「形式が違います。」と言う。
例えば、「123-4567」と入力すれば、「正しく入力されました」と表示され、「abc-defg」や「12-3456」と入力すると、「形式が違います」と表示されます。
『[str]』のパターンでは、strに指定した文字列のうち、どれか1文字を表します。例えば、時間を入力する場合に、「12:30:00」と書く人もいれば、「12時30分00秒」と書く人もいます。このどちらかの形式のどちらでも良い場合、パターンに、『*[時:]*[分:]*』と指定すれば、漢字で書いても、コロン(「:」)で書いても良いことになります。
以下のプログラムは、いろいろな形式の文字列データを1行ずつ調べていって、時間の形式『*[時:]*[分:]*』に当てはまるものだけを表示する例です。
プログラム:時間チェック.nako
パターンは「*[時:]*[分:]*」
データは「2005/1/1
20時30分20秒
04:05:12
2005年1月20日」
データを反復
対象をパターンでワイルドカード一致。
もし、それがはいならば、対象を表示。
このプログラムを実行すると、以下の通り、時間形式のデータだけを表示することができます。
また、strに指定する文字列は『[a-c]』のように指定して、aからcまでの範囲を表すこともできます。
以下のプログラムは、アルファベットをチーム名にしたデータの中から、BチームからDチームまでの範囲を表示します。
プログラム:一致3.nako
「Aチーム
Bチーム
Cチーム
Dチーム
Eチーム」を反復
対象が「[B-D]チーム」にワイルドカード一致するか。
もし、それがはいならば、対象を表示。
プログラムを実行すると、以下のようにB〜Dのチーム名が表示されます。
次にワイルドカードの『[!str]』のパターンですが、これは、strに指定した以外の1文字を表します。
数字以外の1文字を表す場合は、『[!0-9]』と指定できます。
これは、strに指定した文字列のうちのどれかが繰り返し使われた場合のパターンを表します。
プログラムとして書くと、若干見づらくなってしまいますので、パターンがマッチするかどうかだけを書いてみます。
対象文字列 | ワイルドカード | 結果 |
すもも | す[*も] | はい |
すもももももも | す[*も] | はい |
すし | す[*も] | いいえ |
このように、『す[*も]』と書いた場合、「すもも」も「すももももも」もマッチするのです。しかし、「すし」には、「も」が含まれないので、マッチしません。
さて、『[*str]』と『[+str]』の違いですが、『[*str]』を指定した場合は、0文字以上の繰り返しです。そして、『[+str]』と指定した場合は、1文字以上の繰り返しです。
即ち、『[*str]』の場合は、strに指定した文字列があってもなくても良く、『[+str]』の場合は、必ず1文字以上はないとマッチしないということになります。
対象文字列 | ワイルドカード | 結果 |
す | す[*も] | はい |
す | す[+も] | いいえ |
すし | す[*め]し | はい |
すし | す[+め]し | いいえ |
これは、文字列aか、文字列bのどちらかを表します。
対象文字列 | ワイルドカード | 結果 |
トマト | ト[=マト|ースト] | はい |
トースト | ト[=マト|ースト] | はい |
トイレ | ト[=マト|ースト] | いいえ |
『(str)』は特別な意味を持ちます。パターンを、『(a*c)』のようにカッコで括ると、カッコの内側にマッチした文字を抽出することができます。
抽出した文字列は、『抽出文字列』という変数に代入されます。以下のプログラムを実行して結果を確かめてみましょう。
プログラム:抽出文字列.nako
「123-456」を「(*)-(*)」でワイルドカード一致。
抽出文字列を言う。
このプログラムを実行すると、以下のようにカッコで括った部分にマッチした文字列を抜き出すことができます。
ワイルドカードを使って文字列を置換することができます。
プログラム:ワイルドカード置換.nako
文章は「東京大学を受験〜東大に合格」
文章の「東[*京]大[*学]」を「京大」にワイルドカード置換。
それを言う
これを実行すると『京大を受験〜京大に合格』と置換されます。
ワイルドカードで文字列を区切ることもできます。
プログラム:ワイルドカード区切る.nako
「2005/02/03 04:22:11」を「[/: ]」でワイルドカード区切る。
それを言う。
これを実行すると、"/"や":"や" "で区切られるので、結果以下のように各数値のみを取り出すことができます。
2005
02
03
04
22
11