C#_正規表現における「\」と「"」

「ファイル名に次の文字は使えません」の実装で意外とハマった。

結論から

  • @ を用いた場合、「 " を指定したいなら "" と指定
  • テキストボックス入力した「 \ 」や「 " 」は
    \\ 」「 \" 」とエスケープされて送られてくる

 

※ using System.Text.RegularExpressions; 必要。

ex ) 弾く文字は「 \ / : * ? " < > | 」

    Regex regex = new Regex(@"[\\/:*?""<>|]");
    if (regex.Match(textBox1.Text).Success)
    {
        MessageBox.Show("hoge\r\n\\ / : * ? \" < > |");
    }

 \ は ¥マーク ( バックシュラッシュ ) 。

 

@

@ を使うとエスケープする必要がなくなる。@quotedstring と呼ぶ。

    "C:\\Users\\Hoge"
が下記の様に書ける。
    @"C:\Users\Hoge"

ダブルクォーテーション「 " 」自身を記述するために
" エスケープ文字となってる。
よって「 " 」を含めたい場合は「""」と二重にする。

 

\\  ( @ なしの場合 )

メタ文字の機能を無効にする。つまりただの文字「¥」となる。

メタ文字:プログラムで特別な意味となる。
¥ エスケープ文字。メタ文字をただの文字にする。

 

[ ]

[ ] うちのどれか1文字
[abc] なら a or b or c 。

 

 

Regex.Match ( string ) について

string は検索対象文字列。

戻り値は、System.Text.RegularExpressions.Match
検索結果の情報を返す。

System.Text.RegularExpressions.Matchプロパティ 下記以外にもある。
ex )
Success は一致が成功したか否かの値を返す。
Index は一致した文字列の位置を返す。
Empty は一致する対象が見つからなかった時、この空一致を返す。

 

Regex.Match は、指定した正規表現最初に一致する箇所の検索。
Regex.Matches は、指定した正規表現一致する対象を全て検索。

Regex.Matches の戻り値は
System.Text.RegularExpressions.MatchCollection
Success はないので、代わりに Count を使って判断する書き方になるかと。

 

 

経緯 memo

@"[\/:*?""<>|]"
と書いて \ を入力しても if 文 は false を返していた。

@"[\\
と書かないと true を返してはくれなかった。

@ ないバージョンだと
"[\\\\/:*?\"<>|]")
と書かないと true を返さず。

デバッグしたら解決した。

 

 

こちらから。
http://www.atmarkit.co.jp/ait/articles/1709/27/news017.html
https://blog.dreamhive.co.jp/yama/1149.html
https://dobon.net/vb/dotnet/string/regex.html
https://dobon.net/vb/dotnet/string/regexmatch.html
https://msdn.microsoft.com/ja-jp/library/twcw2f1c(v=vs.110).aspx
https://msdn.microsoft.com/ja-jp/library/e7sf90t3(v=vs.110).aspx
https://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.regex_methods(v=vs.110).aspx

 

以上。

hoge の箇所は
The following characters are not supported:
以下の文字はサポートされていません。