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

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

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

Re[2]: カッコ内の数値を正規表現で取得できません。


(過去ログ 120 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■70278 / inTopicNo.1)  カッコ内の数値を正規表現で取得できません。
  
□投稿者/ mina (1回)-(2014/03/06(Thu) 23:05:24)

分類:[C#] 

2014/03/06(Thu) 23:08:50 編集(投稿者)
2014/03/06(Thu) 23:06:21 編集(投稿者)
2014/03/06(Thu) 23:06:10 編集(投稿者)

C#2010expressで開発しています。

下記の配列で()カッコがある場合に
()カッコ内の最大番号を取得しようとしているのですが、
下記のようにすると正規表現の部分で落ちました。

どう書き換えたら良いのでしょうか?
どなたか分かる方がいましたら教えてください。
よろしくお願いします。

string[] csv = new string[4];

csv[0] = "ばなな";
csv[1] = "ばなな(12)";
csv[2] = "ばなな(5)";
csv[3] = "ばなな(200)";

int 最大番号=0;
for (int i = 0; i <= csv.Count() - 1; i++)
{
Regex re = new Regex("(?*)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
Match mc = re.Match(csv[i]);
if (int.Parse(mc.Groups[1].Value.ToString()) > 最大番号)
{
最大番号 = int.Parse(mc.Groups[1].Value.ToString());
}
}

引用返信 編集キー/
■70279 / inTopicNo.2)  Re[1]: カッコ内の数値を正規表現で取得できません。
□投稿者/ Azulean (280回)-(2014/03/07(Fri) 00:11:51)
まずは正規表現のドキュメントを読み直してみてください。
http://msdn.microsoft.com/ja-jp/library/az24scfc.aspx#quantifiers

? は直前の文字を 0 回、または 1 回にマッチすることを指定する文字ですが、その直前の文字は ( なので、グループ化とみなされ、有効な文字が存在しません。
従って、正規表現のパターンとして正しくないとして例外が発生することになります。

やるとしたら、"\\((\\d+)\\)" あたりじゃないですかね。
(\\ を重ねているのは文字列としてのエスケープ記号の意味もあるため。わかりやすさ向上のため、@"\((\d+)\)" でもよい)
引用返信 編集キー/
■70280 / inTopicNo.3)  Re[1]: カッコ内の数値を正規表現で取得できません。
□投稿者/ shu (502回)-(2014/03/07(Fri) 00:30:22)
2014/03/07(Fri) 00:30:39 編集(投稿者)
No70278 (mina さん) に返信


(と)は正規表現内では1つのまとまりを囲うのに使用するのでそのものの文字として
マッチングする場合、\を付加する必要があります。
\を付加する文字列を書く場合、@を頭に付けると書きやすいです。
括弧内の文字が数値でないとint.Parse出来ないので\d+により数値とマッチングさせる
必要があります。



正規表現 + LINQの例

            string[] csv = new string[4] { "ばなな", "ばなな(12)", "ばなな(5)", "ばなな(200)" };

            Regex re = new Regex(@"\((?<num>\d+)\)");

            int mx = (from dat in csv
                      let m = re.Match(dat)
                      where m.Success
                      select int.Parse(m.Groups["num"].Value)
                      ).Max();


引用返信 編集キー/
■70296 / inTopicNo.4)  Re[2]: カッコ内の数値を正規表現で取得できません。
□投稿者/ mina (2回)-(2014/03/08(Sat) 00:04:54)
2014/03/08(Sat) 00:06:13 編集(投稿者)

No70279 (Azulean さん) に返信
> まずは正規表現のドキュメントを読み直してみてください。
> http://msdn.microsoft.com/ja-jp/library/az24scfc.aspx#quantifiers
>
> ? は直前の文字を 0 回、または 1 回にマッチすることを指定する文字ですが、その直前の文字は ( なので、グループ化とみなされ、有効な文字が存在しません。
> 従って、正規表現のパターンとして正しくないとして例外が発生することになります。
>
> やるとしたら、"\\((\\d+)\\)" あたりじゃないですかね。
> (\\ を重ねているのは文字列としてのエスケープ記号の意味もあるため。わかりやすさ向上のため、@"\((\d+)\)" でもよい)

Azulean さん
ありがとうございました、
(が入ると、ややこしいんですね。

大変勉強になりましたし、
上手く取得する事が出来ました。

解決済み
引用返信 編集キー/
■70297 / inTopicNo.5)  Re[2]: カッコ内の数値を正規表現で取得できません。
□投稿者/ mina (3回)-(2014/03/08(Sat) 00:11:12)
No70280 (shu さん) に返信
> 2014/03/07(Fri) 00:30:39 編集(投稿者)
>
> ■No70278 (mina さん) に返信
>
>
> (と)は正規表現内では1つのまとまりを囲うのに使用するのでそのものの文字として
> マッチングする場合、\を付加する必要があります。
> \を付加する文字列を書く場合、@を頭に付けると書きやすいです。
> 括弧内の文字が数値でないとint.Parse出来ないので\d+により数値とマッチングさせる
> 必要があります。
>
>
>
> 正規表現 + LINQの例
>

> string[] csv = new string[4] { "ばなな", "ばなな(12)", "ばなな(5)", "ばなな(200)" };
>
> Regex re = new Regex(@"\((?<num>\d+)\)");
>
> int mx = (from dat in csv
> let m = re.Match(dat)
> where m.Success
> select int.Parse(m.Groups["num"].Value)
> ).Max();
>

shuさん分かりやすい説明ありがとうございます。
()では\を使う事が分かりませんでした。
しかもいっぺんにMAXを取れるやり方があるんですね。

凄くわかりやすいソースですね。
実際に動かしてみたら上手く動作出来ました。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -