現在、ファイルパスの検証に役立つ正規表現を探しています:
C:\test\test2\test.exe
正規表現を使用するこの回答を投稿することにしました。
^(?:[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クラスを使用して、ファイルまたはフォルダーが存在するかどうかを確認することをお勧めします。
ファイル名を処理することが目的の場合、正規表現の代わりに Pathクラス を使用することをお勧めします。
たとえば、 Path.GetFullPath を呼び出してパスを「検証」できます。パスに無効な値が含まれている場合はArgumentException
が発生するためです。文字、およびパスが長すぎる場合は他の例外を除きます。これにより、すべてのルールが処理され、正規表現では修正が困難になります。
これは、Windowsパスの正規表現です。
(^([a-z]|[A-Z]):(?=\\(?![\0-\37<>:"/\\|?*])|\/(?![\0-\37<>:"/\\|?*])|$)|^\\(?=[\\\/][^\0-\37<>:"/\\|?*]+)|^(?=(\\|\/)$)|^\.(?=(\\|\/)$)|^\.\.(?=(\\|\/)$)|^(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+))((\\|\/)[^\0-\37<>:"/\\|?*]+|(\\|\/)$)*()$
これはUNIX/Linuxパス用です
^\/$|(^(?=\/)|^\.|^\.\.)(\/(?=[^/\0])[^/\0]+)*\/?$
私のテストは次のとおりです。
これらはJavascriptで動作します
[〜#〜] edit [〜#〜]相対パスを追加しました(../、./、../something)
EDIT 2UNIXのチルダで始まるパスを追加しました(〜/、〜、〜/ something)
提案されたものは本当に良くありません、これは私がXSD用に構築したもので、Windows固有のものです:
^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$
WindowsおよびLinuxのサポートについては、これを試してください:((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})
この正規表現を使用して、「C:\」や「\\ serverName」などのルートパスを除外して、Windowsで有効なファイル/フォルダーパス(UNCおよび%variables%を含む)をキャプチャします。
^(([a-zA-Z]:|\\\\\w[ \w\.]*)(\\\w[ \w\.]*|\\%[ \w\.]+%+)+|%[ \w\.]+%(\\\w[ \w\.]*|\\%[ \w\.]+%+)*)
この正規表現はパス要素の先頭のスペースと一致しないため、
変数はどのレベルでも許可されます
regex CmdPrompt("^([A-Z]:[^\<\>\:\"\|\?\*]+)");
基本的に、禁止されているWindowsパス文字のリストにないすべてのものを探します。
< (less than)
> (greater than)
: (colon)
" (double quote)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
Alexanderは、ファイル名のスペースをサポートしているため、これまでのところ最も正しい答えを持っています(つまり、C:\Program Files (x86)\
は一致します)...これは、相対パスも含めることを目的としています。
たとえば、_cd /
_または_cd \
_を実行でき、同じことを行います。
さらに、現在_C:\some\path\to\some\place
_にいて、これらのコマンドのいずれかを入力すると、_C:\
_になります
さらに、(現在のドライブへの)ルートパスとして「/」で始まるパスを検討する必要があります。
_(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\)|/)([^,\/:*\?\<>\"\|]+(\|/){0,1})
_
ただし、Alexanderの回答の修正版では、先頭に_/
_またはドライブ文字がない相対パスと、先頭にドライブ文字がない_/
_(ルートとしての現在のドライブに対して)が含まれています。
ここでの回答のほとんどは、少しのヒットまたはミスであることがわかりました。
ここで良い解決策を見つけました:
注*-これはネットワーク共有専用です-ローカルファイルではありません
回答:
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
}
}