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

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

ただいまの
回答率

91.24%

  • C#

    5036questions

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

  • 正規表現

    612questions

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

ArgumentExceptionが出る条件

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 78

前提・実現したいこと

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

発生している問題・エラーメッセージ

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

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

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

該当のソースコード

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

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

  • 「[」や「(」は例外を吐くのに、「{」や「]」は例外を吐かないのは理由がありますか?
    →Microsoftのリファレンスを読みましたが、見つかりませんでした。
    「正規表現の解析エラーが発生した」時にArgumentExceptionを吐くようですが、
    「そもそも何を以て解析エラーとしているか」を知ることが出来ませんでした。
     
  • これを回避するスマートな方法がありますか?
    →入力文字列に"]"があり、その前方に"["が無ければエラーを出す、等を1つずつ見ていく。解析エラーの条件が分かれば、1つずつ根性で見ていこうとは思ったのですが…。そうするしかない?
    →そもそも、例外を見る、なんてそんなことは普通しない…?
     
     

補足情報(言語/FW/ツール等のバージョンなど)

C#
.NET Framework 4.5.1
Postgresql

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/22 13:14

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

    キャンセル

  • 2017/12/22 13:32

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

    キャンセル

  • 2017/12/22 13:45

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

    キャンセル

  • 2017/12/22 13:51

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

    キャンセル

  • 2017/12/22 14: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
    では ( [ はいずれもグループ構成体に分類されていますが、{ は 限定子になっています。

    他のマッチングパターンを内部に含む ( [ と外に持つ限定子では扱いが違うということなのでしょう。
    () の閉じ忘れは多々ありますが、{} は内部の記述が少なく固定されているために閉じ忘れが少ないということで扱いが違うのではないかと思います。

    キャンセル

  • 2017/12/22 14:53

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

    キャンセル

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

ただいまの回答率

91.24%

関連した質問

  • 解決済

    postgresql case when 中に left join を追加ほしい

    例:select id,name from table_a, id=1の場合はleft jion 追加欲しい。 select a.id,a.name  from table_

  • 解決済

    [postgresql]新しい演算子の作成について

    下記ビット管理の質問について、 https://teratail.com/questions/10131 ビット値で、特定の値を除く方法として、 下記のSQLで処理できま

  • 解決済

    PostgreSQLの配列型の全要素の比較

    前提・実現したいこと PostgreSQLの配列型の全要素を比較してすべて大きい場合のみTrueを返したいです。 例えば array[1, 2, 3] と array[1

  • 解決済

    postgresのデータ取得時間を短縮したい

    タイトルの通りpostgresからデータを取得する時間を短縮したいです。 以前にも質問させていただいたのですが、前回とは少し内容が変わっております。 テーブルには2700万

  • 受付中

    postgrephp 同じテーブル通しでjoin

    テーブル datas ``` カラム Code Codetype name 1      228     りんご 2      228     パイナップル 1   

  • 受付中

    postgreSQL 3つのjoinしたSQL書く

    テーブル rankテーブル touroko_ymd riyou_amt kousin_func kaiin_rank codetbテーブル code_nm code

  • 解決済

    sql select文での''の使用について

    postgresqlにて select '' as 宣言した名前,'' as 宣言した名前(2) form テーブル名 のような select部分でカラム名を宣言すると

  • 解決済

    where句にcase文

    あるテーブルから男女どちらか、または両方のデータを取得するようなSQLを作成したいのですがうまくいきません。お力を貸していただけたらと思います。 現在作っているSQLは以下の

同じタグがついた質問を見る

  • C#

    5036questions

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

  • 正規表現

    612questions

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