DOBON.NET DOBON.NETプログラミング掲示板過去ログ

文字列が正規表現として扱えるかを判別する方法

環境/言語:[Windows XP SP2 / C# 2003]
分類:[.NET]

じゅでです。
いつもこちらの掲示板の皆様には、お世話になっております。

今回は、題名の通り、文字列を正規表現として扱えるかを判定する
方法を探しております。

ためしに、IsMatchを使用して、引数に正規表現として取り扱う事が出来ない
文字列を入れてみたところ、IsMatchでエラーが戻ってくるとおもいきや、
catchに飛ばずに、そのまま処理が続行されていくので、現在困っております。
(falseで処理が戻ってくる)

文字列が動的に変わる中で、正規表現として文字列を取り扱い、
正規表現に合わせて文字列を変更するか、別の処理を行うかという処理を
組んでいるので、もし似たような事をしておられる方がいらっしゃいましたら、
お知恵をお貸し下さい。

よろしくお願いします。

以上
IsMatchですから、例外ではなく結果のboolが返ってきますよ。

それとも、調査する文字列の側ではなくパターンの側に、使用できない文字列という意味ですか?
具体的にどのようなパターンでしょうか。
本来、問題があれば例外が発生します。
例えば
System.Text.RegularExpressions.Regex.IsMatch("aaaa", "(?xx")
等としてわざとグループ化構成体を中途半端に終わらせたパターンを指定すると
例外になるようですが。
正規表現の仕様を満たすpattern文字列かどうかは、ずばりの関数なりが無いと判断できないのではないでしょうか。
その理由は、
・任意の非制御文字列を含めることが可能なこと
・文字ひとつひとつがどのような意図で存在しているかわからないこと
 #これはずばりの関数があったとしても同じことです。
・必ず例外が発生するとは限らないこと
により先の結論に至ります。

したがって「それがPatternである」ことはコード上に現れることは無く
Frameworkに仕様が隠蔽されている以上、自分で解析して判断するしかないと思います。

「パターンとして認識されたかどうか」のみが条件なら
こどさんの言われるように何らかの例外トラップで対処できそうです。
こど。様 まどか様
ご返答ありがとうございます。

> それとも、調査する文字列の側ではなくパターンの側に、使用できない文字列という意味ですか?
> 具体的にどのようなパターンでしょうか。

申し訳ありません。
書き方が悪かったです。

まどか様のいっている以下のような事となります。

> 正規表現の仕様を満たすpattern文字列かどうかは

やはり関数がいりますか・・・
しかしながら、あまり現実的ではないかなぁ〜と考えております。

正規表現の説明だけで本がうってるようなものを、正しいかどうか
判別するだけのコードを私がかけないというのが一番の理由となります。

何かどっかに転がってないですかね。
ご存知の方がおられましたらよろしくお願いいたします。
> やはり関数がいりますか・・・
> しかしながら、あまり現実的ではないかなぁ〜と考えております。
まぁ、正規表現クラス自体を駆使して自作できないこともないでしょうが、
グループ化構成体その他かなり広範な「文法」をサポートしたチェックが必要になるでしょうねぇ。
(まぁ全機能ではなく限定的なサポートのみでチェックするのであればそれなりに何とかなるでしょうけど。)

でも、IsMatchやnew Regexはパターンを「コンパイル」してインスタンスを作るわけで
その際エラーを具体的なメッセージ付きの例外として受け取ることができる…はずなので、
明らかに文法的に不正なパターン記述なのに例外を発生させずなぜかへんてこなインスタンスを生成できてしまう
パターンの例が見つかったのであれば
正規表現の解釈機構の不具合でしょうからMSさんに伝えるべきでしょうねぇ。

> 正規表現として取り扱う事が出来ない文字列
で
> falseで処理が戻ってくる
例は、一体どんな文字列なのでしょう?
返事が遅くなりまして申し訳ありません。

> 例は、一体どんな文字列なのでしょう?
具体的には「.」などのメタ文字扱いされるべき文字列などです。

まぁ〜それ以外にもメタ文字と通常の英数字がごっちゃになってたりするような
ものに関してです。

> でも、IsMatchやnew Regexはパターンを「コンパイル」してインスタンスを作るわけで

new Regexでありますか。
めんどくさかったのでこうしてたりします。
if(System.Text.RegularExpressions.Regex.IsMatch(input, pattern, options))

使い方を限定すれば書式チェックも出来そうではありますが、
きっとその使い方がいろいろ増えるので、あきらめて正しいのをはじめっから
書いてくれといっておきます。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板