- PR -

正規表現について

投稿者投稿内容
イルカ
会議室デビュー日: 2003/09/04
投稿数: 6
投稿日時: 2003-09-24 16:08
いつもお世話になっています。イルカと申します。
現在ASP.netでテキストボックスに入力された
Windows形式のファイルパスの検証を
RegularExpressionValidatorを用いて行おうとしています。
次のような形式の妥当性を検証しようとしているのですが、
うまく正規表現が利用できません。
どのようにすればよいのか教えてください。

検証したいフォーマット:(\文字列)\ファイル名.拡張子
条件:
()で囲まれた箇所は1回以上の繰り返しを許可する。
ファイル名は拡張子付きで指定されなければいけない。
(拡張子は何でも構わない)
例:C:\project\app\test.tl

よろしくお願いします。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2003-09-24 16:40
引用:

イルカさんの書き込み (2003-09-24 16:08) より:
現在ASP.netでテキストボックスに入力された
Windows形式のファイルパスの検証を
RegularExpressionValidatorを用いて行おうとしています。
次のような形式の妥当性を検証しようとしているのですが、
うまく正規表現が利用できません。


コード:
C:\project\app\test.tl


のような感じの書式をチェックするような正規表現をちょちょいと作ってみましたが、
コード:
([A-Za-z]:)?([\\].+)+\..+


のようなイメージかな?
しかし念のためですが、これでは次のような不正パスも通りますから、こんな程度の正規表現ではまだまだ足りませんので。
コード:
\\.a
C:\:/\\*\.?


dai
ベテラン
会議室デビュー日: 2001/08/28
投稿数: 85
投稿日時: 2003-09-24 16:50
読み込みならば、
・File.Exist メソッド

書き込みならば、
・テスト的にファイルを作成してみて、削除する

で、検証できないでしょうか?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-09-24 17:32
ども、ほむらです。
正規表現の場合、良くわからないときは反対の条件を
指定してあげるとうまくいったりします。
たとえば。
コード:
\w:\[^\/:;,*?<>|]+


こんな感じでどうでしょう。。。
実際には¥は二つ重ねる必要があるかもしれません。
ちなみに、[^〜]+ がファイルの部分です。

#UNCは必要ないようなので修正
#拡張子の部分はがんばってみてください(笑

[ メッセージ編集済み 編集者: ほむら 編集日時 2003-09-24 17:44 ]
イルカ
会議室デビュー日: 2003/09/04
投稿数: 6
投稿日時: 2003-09-24 18:52
ぢゃん♪さん、daiさん、ほむらさん
ご返答ありがとうございます。

コード:
([A-Za-z]:)?([\\].+)+\..+

だと確かに\\\

でも許可されてしまうので
コード:
\w:\\[^\/:;,*?<>|]+で試したのですが、^を指定してみても

\\\


の形式が許可されてしまいます。
コード:
([A-Za-z]:)?([\\].{1}+)+\..+


{1}を指定してみてもうまくいかなかったのですが
何がいけないのでしょうか。

よろしくお願いします。


[ メッセージ編集済み 編集者: イルカ 編集日時 2003-09-24 19:05 ]
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-09-25 09:48
ども、ほむらです。
すでに気が付いているかもしれませんが
[^¥/:;,*?<>|]の¥は二つ重ねる必要があります。
ファイル名で使用できない文字が知りたければ
エクスプローラーから名前の変更で¥とか半角を使用すれば
(警告として)一覧が表示されます

# []の内部でもメタキャラクタは使用できるので
# ¥/では/を指定したのと同じになってしまいます

#以下追加
ちなみに。
コード:
([A-Za-z]:)?([\\].{1}+)+\..+


という正規表現の.は一文字のワイルドカードなので
文字の種類は問いません。なのでC:\\も可能なんです。。。
もし、僕的な正規表現で表現するなら
コード:
^([A-Za-z]:)?[^/:;,*?<>\|]*[^\\]\\[^\\/:;,*?<>\|]+\.[^\\/:;,*?<>\|]+$


でしょうか。たぶん思ったとおりに動くと思うのですが。。。
これならファイル名と拡張子も取得できるようになっているのは蛇足です(笑


[ メッセージ編集済み 編集者: ほむら 編集日時 2003-09-25 10:01 ]

[ メッセージ編集済み 編集者: ほむら 編集日時 2003-09-25 10:04 ]
Marionette
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 70
投稿日時: 2003-09-25 12:46
コード:
> ^([A-Za-z]:)?[^/:;,*?<>\|]*[^\\]\\[^\\/:;,*?<>\|]+\.[^\\/:;,*?<>;\|]+$

  ↓
^([A-Za-z]:)?[^\/:;,*?<>\|]*[^\\]\\[^\\\/:;,*?<>\|]+\.[^\\\/:;,*?<>\|]+$


"/"はエスケープしないといけないのではないですか? としても、

コード:
C:\\project\app\test.tl


も通りそうです。

コード:
^([A-Za-z]:)((\\){0,1}[A-Za-z0-9_]+(\.)*([A-Za-z0-9_]*))+


普段使っているやつをちょっとアレンジしたものです。
一応ドット付の(で始まる)ディレクトリ、拡張子なしのファイル名でもOKのようです。
相対ディレクトリもいけます。自由度を考えすぎてミスってるかもしれません。
拡張子が必要なら
コード:
^([A-Za-z]:)((\\){0,1}[A-Za-z0-9_]+(\.)*([A-Za-z0-9_]*))+\.[A-Za-z0-9_]+


かな? 自信なし。
ファイル名に使用する文字が不足していたら2番目以降の[]を補う必要があります。
回答にあったように否定を使うのもよいです。


[ メッセージ編集済み 編集者: Marionette 編集日時 2003-09-25 13:07 ]
イルカ
会議室デビュー日: 2003/09/04
投稿数: 6
投稿日時: 2003-09-25 13:25
Marionetteさん、ほむらさんありがとうございます。
確かに
コード:

^([A-Za-z]:)?[^/:;,*?<>\|]*[^\\]\\[^\\/:;,*?<>\|]+\.[^\\/:;,*?<>\|]+$


で思うように動作できるようになりました。
私が行おうとしているのはファイル名が日本語の場合も許可するので、
ほむらさんのパターンだと通らないですね。
しかし、
コード:

C:\\project\app\test.tl


のように\\を不可にすることができますね。
これを参考にうまく組合わせてみようと思います。
ありがとうございます。


[ メッセージ編集済み 編集者: イルカ 編集日時 2003-09-25 13:31 ]

スキルアップ/キャリアアップ(JOB@IT)