お世話になっております。超初心者です・・・
ワイルドカードを使って、「〜9.〜」というファイル(例えばex9.txt)を検索したいのですが、「ex.d09」のようなファイルまであがってきてしまいます。
List:=TStringList.Create;
FoundDB:=FindFirst(Cdir+'\Data'+'\*9.*',faAnyFile,SearchRec);
while FoundDB=0 do
begin
List.Add(SearchRec.Name);
FoundDB:=FindNext(SearchRec);
end;
ソースはこんな感じなんですが、どうやら'.'が任意の1文字と認識されてしまうようです。(ヘルプを見てもそう書いてありました)
'.'を「任意の一文字」ではなく「.」と認識する方法を存知でしたら教えて下さい。
環境は、Delphi4、WinNTです。
よろしくお願いします。
任意の1文字は'?'だったような・・・。
ヘルプを見ても、'.'が任意の1文字として認識するという記述はありませんでした。
'\*9.a*'で検索しても、
d09aaa
d09baa
は見つけませんでした。'.'が任意の1文字ならば、検索できるはずですから、違うのでしょう。
たぶんですが、'.'はある条件で消えてしまうのだと思います。
MS-DOS(さらにはCP/M)の頃は、8+3形式のファイル名でした。
このころのワイルドカードは、*を?に展開していました。
たとえば、
[abc*.txt]は、
[abc?????txt]
にしていました。
Windows95からは、ロングファイル名に対応していますが、ワイルドカードの処理は似たような仕様にしたのかもしれません。
そうなると、*9.*は、*9*と同じように扱われると思います。
ちなみに、*9.a*では、aaa9abbを見つけられません。
'.'を認識する方法は見つかりませんでしたが、そう難しく考えずに、見つけたファイル名に'9.'が含まれているかどうか調べればよいと思います。
う〜ん・・・うちの環境では、やっぱり
d09aaa
d09baa
もあがってくるんですよね・・・なんでだろう???
とりあえず、現在はファイル名に'9.'が含まれるかどうかを判定しています。
Delphi4のヘルプで「ワイルドカード」を検索すると、「正規表現」と「Bref型正規表現」が出てきて、「正規表現」の方の説明の中に、'.'は任意の一文字であるという説明が載っています。。。
うーーーん???
正規表現って使えましたっけ?
もし、正規表現ならば、
[^9]*9\..*
とすればよいと思います。
ただ、正規表現は、Delphiの検索で使うものみたいです。
FindFirstで使えるワイルドカードは、*と?だと思います。
間違えました。
[^9]だと、9.の9より前に9がある場合にヒットしません。
.*9\..*
でよいかと。
あいや〜やっぱりだめですねぇ〜
これはもしかして、Delphiのバグか???それとも私の環境がおかしいのか???
とりあえず、今は‘9.’を含むやつのみリストに追加という苦しい逃げをしています。
ツイート | ![]() |