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

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

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

Re[3]: Regexで特定の文字の位置をカウントする


(過去ログ 90 を表示中)

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

■53367 / inTopicNo.1)  Regexで特定の文字の位置をカウントする
  
□投稿者/ marinko (3回)-(2010/09/11(Sat) 09:48:39)

分類:[.NET 全般] 

C#である特定の文字の位置を割りだそうとしています。

下記のコードで全体のWord数はカウントできたんですが、
例えば”for”の位置が何個目かを出したい場合にどのようにすればいいのか、困っています。

全体 7
For 6

と出したいです。

const string t2 = "This is a sample code for regex.";

MatchCollection collection = Regex.Matches(s, @"[\S]+");
return collection.Count;


なにかいい方法があれば、よろしくお願いいたします。
引用返信 編集キー/
■53369 / inTopicNo.2)  Re[1]: Regexで特定の文字の位置をカウントする
□投稿者/ Hongliang (709回)-(2010/09/11(Sat) 11:10:56)
MatchCollection を for ループで巡回して、それぞれの Match の Value を確認して、合ってるならそのときのコレクションのインデックス(は 0 ベースだから +1 したりとか)。
引用返信 編集キー/
■53370 / inTopicNo.3)  Re[2]: Regexで特定の文字の位置をカウントする
□投稿者/ やじゅ (1723回)-(2010/09/11(Sat) 12:45:49)
やじゅ さんの Web サイト
2010/09/11(Sat) 15:31:39 編集(投稿者)
> MatchCollection を for ループで巡回して、それぞれの Match の Value を確認して、
> 合ってるならそのときのコレクションのインデックス(は 0 ベースだから +1 したりとか)。

コード化すると↓、もっと楽な方法があるかも。
int cnt = 1;
foreach (Match m in mc) {
  if (m.Value == "for") break;
  cnt++;
}

http://mop.fya.jp/te2/efia/27.html

追記:Linqを使ってみた。
const string s = "This is a sample code for regex.";

MatchCollection mc = Regex.Matches(s, @"[\S]+");
int i = 1;
var query = from Match v in mc select new { Index = i++, Value = v.Value };
int index = (from w in query where w.Value == "for" select w.Index).First();
MessageBox.Show(String.Format("Count = {0} , Index = {1}", mc.Count, index));

↓

追記:IndexOf変更してみた。
const string s = "This is a sample code for regex.";

MatchCollection mc = Regex.Matches(s, @"[\S]+");
List<string> ql = (from Match v in mc select v.Value).ToList<string>();
MessageBox.Show(String.Format("Count = {0} , Index = {1}", mc.Count, ql.IndexOf("for") + 1));

引用返信 編集キー/
■53393 / inTopicNo.4)  Re[3]: Regexで特定の文字の位置をカウントする
□投稿者/ marinko (4回)-(2010/09/12(Sun) 05:25:31)
返信ありがとうございます。


やじゅさんのコードを採用させていただきました!
int cnt = 1;
foreach (Match m in mc) {
if (m.Value == "for") break;
cnt++;
}

他のコードを試して見ましたが、”from Match v in mc select”でエラーになってしまったので、
上記のコードを使いました。

それに私には一番わかりやすかったです!

他にも似たような質問がありますが、それは後ほど別の投稿をさせていただきます。
ありがとうございました。


No53370 (やじゅ さん) に返信
> 2010/09/11(Sat) 15:31:39 編集(投稿者)
>
> > MatchCollection を for ループで巡回して、それぞれの Match の Value を確認して、
>>合ってるならそのときのコレクションのインデックス(は 0 ベースだから +1 したりとか)。
>
> コード化すると↓、もっと楽な方法があるかも。
> int cnt = 1;
> foreach (Match m in mc) {
> if (m.Value == "for") break;
> cnt++;
> }
>
> http://mop.fya.jp/te2/efia/27.html
>
> 追記:Linqを使ってみた。
> const string s = "This is a sample code for regex.";
>
> MatchCollection mc = Regex.Matches(s, @"[\S]+");
> int i = 1;
> var query = from Match v in mc select new { Index = i++, Value = v.Value };
> int index = (from w in query where w.Value == "for" select w.Index).First();
> MessageBox.Show(String.Format("Count = {0} , Index = {1}", mc.Count, index));
>
> ↓
>
> 追記:IndexOf変更してみた。
> const string s = "This is a sample code for regex.";
>
> MatchCollection mc = Regex.Matches(s, @"[\S]+");
> List<string> ql = (from Match v in mc select v.Value).ToList<string>();
> MessageBox.Show(String.Format("Count = {0} , Index = {1}", mc.Count, ql.IndexOf("for") + 1));
>
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -