C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■85010 / )  Re[1]: 正規表現の考え方がわかりません
□投稿者/ 魔界の仮面弁士 (1402回)-(2017/09/05(Tue) 10:57:21)
2017/09/05(Tue) 11:36:37 編集(投稿者)

No85005 (夜叉丸 さん) に返信
> ra.ToString() = "{X=3, Y=6, Width=9, Height=12}"
> Match m = new Regex(@"{X=(?<X>[-]*\d+),Y=(?<Y>[-]*\d+),Width=(?<Width>[-]*\d+),Height=(?<Height>[-]*\d+)}").Match(ra.ToString());

これではヒットしないと思いますよ。元の文字列が
"{X=3, Y=6, Width=9, Height=12}" ではなく
"{X=3,Y=6,Width=9,Height=12}" であったのなら、
m.Groups["X"] で拾えるでしょうけれども。

カンマの後に空白を許容したいのであれば、
"," ではなく ", " や ",\s*" に変更してみてください。


> int ix = (int.TryParse(m.Groups["X"].ToString(), out ix)) ? ix : 0;
false 判定時には 0 が出力される仕様なので、三項演算子を使わずに
 int ix; int.TryParse(m.Groups["X"].ToString(), out ix);
あるいは
 int ix; int.TryParse(m.Groups["X"].Value, out ix);
でも OK ですね。


> この場合
> "3" = "(?<X>[-]*\d+)" であらわされるということですよね。
元の文字列に空白が含まれていなければ "3" になると思います。


> [-] 連続した文字範囲の1文字 : あるかもしれないしないかもしれないマイナスフラグ
"[-]" は "-" と同義で、それ自体は単なる - 記号です。


> * 直前の文字が0回以上繰り返す。 : なので先頭だから繰り返さないので0回以上?
すなわち、"X=---3" のような文字列に対してもヒットします。
この場合、--- 部がキャプチャされて m.Groups["X"].Value == "---3" となります。

もしも「符号があるかもしれないし無いかもしれない」にしたいのであれば、
"[+-]?" の方が良いかもしれません。


> \d 0から9までの数字       : 数字を使用
半角の "3" だけでなく
全角の "3" にもヒットします。


> ところが同様にfloat の場合どうすればよいのかわかりません。
単純には
 [+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]
などが思い当たります。

float 値として float.NaN や float.NegativeInfinity が含まれる場合にも
対処が必要なら、もう一ひねり必要かも知れません。


// RectangleF r = new RectangleF(float.Epsilon, float.NaN, float.NegativeInfinity, float.PositiveInfinity);
// string rs = r.ToString();
返信 編集キー/


管理者用

- Child Tree -