質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

3741閲覧

ArgumentExceptionが出る条件

heart_crimson

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2017/12/22 03:10

編集2017/12/22 04:40

###前提・実現したいこと
あるシステムから、正規表現をDB(postgresql)に保存する際、
その正規表現が正しいか、「試しにオブジェクトを生成し、例外を吐くか」で見ています。
例外が出なければ保存、出た場合はエラーメッセージを表示し、再度入力を促します。


###発生している問題・エラーメッセージ
"["や"("・"+"・"?"のみを保存しようとすると、ArgumentExceptionを吐くのですが、
"{"や"]"のみは何も吐かれず、保存出来ているのが現状です。
正直なところ、例外を吐かないのだからそのまま進めてしまっても、システム的には特に問題はないのですが、
"["はNGで、"]"はOKってどういう基準?と思い、以下を質問させていただきます。

  • 「[」や「(」は例外を吐くのに、「{」や「]」は例外を吐かないのは理由がありますか?
  • 回避する(エラーが出るようにする)スマートな実装がありますか?

お知恵をお貸しいただければ幸いです。


###該当のソースコード

C#

1private bool CheckErrors() 2{ 3 // 一部省略 4 try 5 { 6 Regex judgementRegex = new Regex(judgementRegexp); 7 } 8 catch (ArgumentException e) 9 { 10 // e.Massageを用いて画面・ログにメッセージを出力。実装済みです。 11 return false; 12 } 13 // DB保存、他の入力項目のエラーチェック等。実装済みです。 14 return true; 15}

###試したこと(調べたこと)

  • 「[」や「(」は例外を吐くのに、「{」や「]」は例外を吐かないのは理由がありますか?
    →Microsoftのリファレンスを読みましたが、見つかりませんでした。
    「正規表現の解析エラーが発生した」時にArgumentExceptionを吐くようですが、
    「そもそも何を以て解析エラーとしているか」を知ることが出来ませんでした。

 

  • これを回避するスマートな方法がありますか?
    →入力文字列に"]"があり、その前方に"["が無ければエラーを出す、等を1つずつ見ていく。解析エラーの条件が分かれば、1つずつ根性で見ていこうとは思ったのですが…。そうするしかない?
    →そもそも、例外を見る、なんてそんなことは普通しない…?

 

###補足情報(言語/FW/ツール等のバージョンなど)
C#
.NET Framework 4.5.1
Postgresql

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

{ や [ は特別な意味を持つメタ文字です。
} や ] は対応する { や [ がある時だけメタ文字になります。
それ以外の時は普通の文字として扱われます。

] 一文字の正規表現は ] という文字にマッチします。
ですから正規表現としては間違っていないのでエラーも出ません。

投稿2017/12/22 03:19

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heart_crimson

2017/12/22 04:14

素早い回答誠にありがとうございます。「"}"は"{"とセットでないとメタ文字にならない」とのことですが、"["は例外を吐いて"{"は例外を吐かないのは、なぜなのでしょうか? 意図はないのでしょうか?
Zuishin

2017/12/22 04:32

間違えました。( のつもりで{ と書いていました。全て置き換えて読んで下さい。 { は他のパターンの後ろについた時だけメタ文字となるはずです。 a{ がエラーになるかどうか確かめて下さい。
heart_crimson

2017/12/22 04:45

"a{"はエラーにならないようです…。エンジンの違いでしょうか?
Zuishin

2017/12/22 04:51

そうでしたか。うろ覚えでいい加減なことを書いてしまったようですみません。 今確かめられないのでまた後で調べます。
Zuishin

2017/12/22 05:18

var regex = new Regex("a{2"); Console.WriteLine(regex.IsMatch("aa")); Console.WriteLine(regex.IsMatch("a{2")); この結果は false, true となりました。 どうも { は単独ではメタ文字と認められず {数字[,数字]} と書かれた時に初めてメタ文字になるようです。 https://msdn.microsoft.com/ja-jp/library/az24scfc(v=vs.110).aspx では ( [ はいずれもグループ構成体に分類されていますが、{ は 限定子になっています。 他のマッチングパターンを内部に含む ( [ と外に持つ限定子では扱いが違うということなのでしょう。 () の閉じ忘れは多々ありますが、{} は内部の記述が少なく固定されているために閉じ忘れが少ないということで扱いが違うのではないかと思います。
heart_crimson

2017/12/22 05:53

microsoftのサイト、拝見いたしました。確かに分類が違いますね。「どこまでがメタ文字か」という考え自体が無かったため、非常に勉強になりました。 今回は、例外が出ない正規表現は、自力で対応しようと思います。この度は誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問