web-dev-qa-db-ja.com

C#-ファイルパスの正規表現C:\ test \ test.exe

現在、ファイルパスの検証に役立つ正規表現を探しています:

C:\test\test2\test.exe
21
Dan

正規表現を使用するこの回答を投稿することにしました。

^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$

これらのために働く:

\\test\test$\TEST.xls
\\server\share\folder\myfile.txt
\\server\share\myfile.txt
\\123.123.123.123\share\folder\myfile.txt
c:\folder\myfile.txt
c:\folder\myfileWithoutExtension

編集:使用例を追加しました:

if (Regex.IsMatch (text, @"^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$"))
{
  // Valid
}

*編集:*これは、表示される可能性のあるパスの近似値です。可能であれば、PathクラスまたはFileInfoクラスを使用して、ファイルまたはフォルダーが存在するかどうかを確認することをお勧めします。

30
agent-j

ファイル名を処理することが目的の場合、正規表現の代わりに Pathクラス を使用することをお勧めします。

たとえば、 Path.GetFullPath を呼び出してパスを「検証」できます。パスに無効な値が含まれている場合はArgumentExceptionが発生するためです。文字、およびパスが長すぎる場合は他の例外を除きます。これにより、すべてのルールが処理され、正規表現では修正が困難になります。

24
Reed Copsey

これは、Windowsパスの正規表現です。

(^([a-z]|[A-Z]):(?=\\(?![\0-\37<>:"/\\|?*])|\/(?![\0-\37<>:"/\\|?*])|$)|^\\(?=[\\\/][^\0-\37<>:"/\\|?*]+)|^(?=(\\|\/)$)|^\.(?=(\\|\/)$)|^\.\.(?=(\\|\/)$)|^(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+))((\\|\/)[^\0-\37<>:"/\\|?*]+|(\\|\/)$)*()$

これはUNIX/Linuxパス用です

^\/$|(^(?=\/)|^\.|^\.\.)(\/(?=[^/\0])[^/\0]+)*\/?$

私のテストは次のとおりです。

Win Regex

nix Regex

これらはJavascriptで動作します

[〜#〜] edit [〜#〜]相対パスを追加しました(../、./、../something)

EDIT 2UNIXのチルダで始まるパスを追加しました(〜/、〜、〜/ something)

10
monkeythedev

提案されたものは本当に良くありません、これは私がXSD用に構築したもので、Windows固有のものです:

^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$
7
Alexander

WindowsおよびLinuxのサポートについては、これを試してください:((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})

4
ryan

この正規表現を使用して、「C:\」や「\\ serverName」などのルートパスを除外して、Windowsで有効なファイル/フォルダーパス(UNCおよび%variables%を含む)をキャプチャします。

^(([a-zA-Z]:|\\\\\w[ \w\.]*)(\\\w[ \w\.]*|\\%[ \w\.]+%+)+|%[ \w\.]+%(\\\w[ \w\.]*|\\%[ \w\.]+%+)*)

この正規表現はパス要素の先頭のスペースと一致しないため、

  • 「C:\ program files」が一致します
  • 「C:\ pathWithLeadingSpace」が一致しません

変数はどのレベルでも許可されます

  • 「%program files%」が一致します
  • 「内部スペースのあるC:\ myパス\内部スペースのあるmyvar」が一致する
4
regex CmdPrompt("^([A-Z]:[^\<\>\:\"\|\?\*]+)");

基本的に、禁止されているWindowsパス文字のリストにないすべてのものを探します。

< (less than)
> (greater than)
: (colon)
" (double quote)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
1
Bill

アレクサンダーの答え+相対パス

Alexanderは、ファイル名のスペースをサポートしているため、これまでのところ最も正しい答えを持っています(つまり、C:\Program Files (x86)\は一致します)...これは、相対パスも含めることを目的としています。

たとえば、_cd /_または_cd \_を実行でき、同じことを行います。

さらに、現在_C:\some\path\to\some\place_にいて、これらのコマンドのいずれかを入力すると、_C:\_になります

さらに、(現在のドライブへの)ルートパスとして「/」で始まるパスを検討する必要があります。

_(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\)|/)([^,\/:*\?\<>\"\|]+(\|/){0,1})_

ただし、Alexanderの回答の修正版では、先頭に_/_またはドライブ文字がない相対パスと、先頭にドライブ文字がない_/_(ルートとしての現在のドライブに対して)が含まれています。

0
Decoded

ここでの回答のほとんどは、少しのヒットまたはミスであることがわかりました。

ここで良い解決策を見つけました:

https://social.msdn.Microsoft.com/forums/vstudio/en-US/31d2bc84-c948-4914-8a9d-97b9e788b341/validate-a-network-folder-path

注*-これはネットワーク共有専用です-ローカルファイルではありません

回答:

string pattern = @"^\\{2}[\w-]+(\\{1}(([\w-][\w-\s]*[\w-]+[$$]?)|([\w-][$$]?$)))+";
string[] names = { @"\\my-network\somelocation", @"\\my-network\\somelocation", 
    @"\\\my-network\somelocation", @"my-network\somelocation",
     @"\\my-network\\somelocation",@"\\my-network\somelocation\aa\dd",
     @"\\my-network\somelocation\",@"\\my-network\\somelocation"};
foreach (string name in names)
{
 if (Regex.IsMatch(name, pattern))
 {
  Console.WriteLine(name);
   //Directory.Exists function to check if file exists
 }
}   
0
Steve