C# 入門 & 実践 / C sharp

4-20. 正規表現 / RegularExpressions - 2 - グループ


これは面白い機能ですね。
perlでも普通に () の中を で取り出せますが、その配列に名前を付けられるようです。

        static void Main()
        {
            int i ;
            int cnt ;

            string str = @"Microsoft .Net Frameword 2.0 
Microsoft .Net Frameword 2.0 日本語 Language Pack 
Visual C# 2005 Express Edition 
Microsoft SQL Server 2005 Express Edition x86";

            // Regex : 正規表現
            // 大文字で始まる英単語 tango と小数点を含む数字 version を探す
            Regex myRegex = new Regex(@"(?<tango>([A-Z][a-z]+))|(?<version>([0-9]+\.[0-9]+))");

            Console.WriteLine("// MatchCollection で全対象を検索");
            // MatchCollection で全対象を検索
            MatchCollection mc = myRegex.Matches(str);
            cnt = mc.Count;
            if( cnt > 0)
            {
                StringBuilder sb = new StringBuilder();
                for ( i = 0; i < cnt; i++)
                {
                    Match m = mc[i];
                    // この場合はどちらかしかない。
                    if (m.Groups["tango"].Success)
                    {
                        Console.WriteLine("{0} Tango : {1}", i, m.Groups["tango"].Value);
                    }
                    if (m.Groups["version"].Success)
                    {
                        Console.WriteLine("{0} Version : {1}", i, m.Groups["version"].Value);
                    }

                    // 並べて表示してみる。
                    // StringBuilder に文字列を保存しておく
                    sb.AppendFormat("{0} [ {1} / {2} ] \n" , i,m.Groups["tango"].Value,m.Groups["version"].Value);
                }

                // 並べて表示してみる。
                Console.WriteLine("一つずつなので、片方は空です。");
                Console.WriteLine("{0}", sb);
            }

            // ログの解析っぽく利用してみる。
            string log = @"
210.136.161.8 - - [14/Sep/2006:02:55:49 +0900] GET /free/ HTTP/1.1 200 2835 - DoCoMo/2.0 SH901iS(c100;TB;W24H12)
210.136.161.5 - - [14/Sep/2006:02:56:12 +0900] GET /free/ HTTP/1.1 200 3157 - DoCoMo/2.0 SH901iS(c100;TB;W24H12)
210.153.84.202 - - [14/Sep/2006:02:56:30 +0900] GET /free/ HTTP/1.1 200 1874 - DoCoMo/2.0 SH901iS(c100;TB;W24H12)
210.136.161.4 - - [14/Sep/2006:02:56:59 +0900] GET /free/ HTTP/1.1 200 3407 - DoCoMo/2.0 F900i(c100;TB;W22H12)
210.153.84.207 - - [14/Sep/2006:02:57:30 +0900] GET /free/ HTTP/1.1 200 2843 - DoCoMo/2.0 SH901iS(c100;TB;W24H12)
210.136.161.136 - - [14/Sep/2006:02:57:44 +0900] GET /free/ HTTP/1.1 200 1714 - DoCoMo/2.0 N901iC(c100;TB;W24H12)
210.136.161.4 - - [14/Sep/2006:02:57:45 +0900] GET /free/ HTTP/1.1 200 3154 - DoCoMo/2.0 SH901iS(c100;TB;W24H12)
210.136.161.17 - - [14/Sep/2006:02:57:56 +0900] GET /free/ HTTP/1.1 200 1264 - DoCoMo/2.0 SH901iS(c100;TB;W24H12)
210.136.161.22 - - [14/Sep/2006:02:58:16 +0900] GET /free/ HTTP/1.1 200 3199 - DoCoMo/2.0 SH901iS(c100;TB;W24H12)
210.136.161.36 - - [14/Sep/2006:02:58:19 +0900] GET /free/ HTTP/1.1 200 3063 - DoCoMo/2.0 D901iS(c100;TB;W28H15)
";
            Regex logReg = new Regex(@"(?<ip>[0-9\.]+) \- \- \[(?<time>[\S]+) [^\]]+\] GET[^\-]+\- [\S]+ (?<ua>[^\n]+)\n");
            mc = logReg.Matches(log);
            cnt = mc.Count;
            Console.WriteLine("■□■ ログ解析 ■□■\n対象行が {0} 個見つかりました。", cnt);
            // foreach でも出来ます。
            i = 1;
            foreach (Match m in mc)
            {
                Console.WriteLine("{0}. IP:{1}\tTIME:{2}\tUserAagent:{3}",
                    i++,
                    m.Groups["ip"].Value,
                    m.Groups["time"].Value,
                    m.Groups["ua"].Value);
            }
        }

// MatchCollection で全対象を検索
0 Tango : Microsoft
1 Tango : Net
2 Tango : Frameword
3 Version : 2.0
4 Tango : Microsoft
5 Tango : Net
6 Tango : Frameword
7 Version : 2.0
8 Tango : Language
9 Tango : Pack
10 Tango : Visual
11 Tango : Express
12 Tango : Edition
13 Tango : Microsoft
14 Tango : Server
15 Tango : Express
16 Tango : Edition
一つずつなので、片方は空です。
0 [ Microsoft /  ]
1 [ Net /  ]
2 [ Frameword /  ]
3 [  / 2.0 ]
4 [ Microsoft /  ]
5 [ Net /  ]
6 [ Frameword /  ]
7 [  / 2.0 ]
8 [ Language /  ]
9 [ Pack /  ]
10 [ Visual /  ]
11 [ Express /  ]
12 [ Edition /  ]
13 [ Microsoft /  ]
14 [ Server /  ]
15 [ Express /  ]
16 [ Edition /  ]

■□■ ログ解析 ■□■
対象行が 10 個見つかりました。
1. IP:210.136.161.8     TIME:14/Sep/2006:02:55:49       UserAagent:SH901iS(c100;TB;W24H12)
2. IP:210.136.161.5     TIME:14/Sep/2006:02:56:12       UserAagent:SH901iS(c100;TB;W24H12)
3. IP:210.153.84.202    TIME:14/Sep/2006:02:56:30       UserAagent:SH901iS(c100;TB;W24H12)
4. IP:210.136.161.4     TIME:14/Sep/2006:02:56:59       UserAagent:F900i(c100;TB;W22H12)
5. IP:210.153.84.207    TIME:14/Sep/2006:02:57:30       UserAagent:SH901iS(c100;TB;W24H12)
6. IP:210.136.161.136   TIME:14/Sep/2006:02:57:44       UserAagent:N901iC(c100;TB;W24H12)
7. IP:210.136.161.4     TIME:14/Sep/2006:02:57:45       UserAagent:SH901iS(c100;TB;W24H12)
8. IP:210.136.161.17    TIME:14/Sep/2006:02:57:56       UserAagent:SH901iS(c100;TB;W24H12)
9. IP:210.136.161.22    TIME:14/Sep/2006:02:58:16       UserAagent:SH901iS(c100;TB;W24H12)
10. IP:210.136.161.36   TIME:14/Sep/2006:02:58:19       UserAagent:D901iS(c100;TB;W28H15)

こんな感じで、検索できて対象文字列をグループ化して使用できます。



4-19. 正規表現 / RegularExpressions - 1 - 検索 / MatchCollection « 4. C# 入門 Level 2 » 4-21. 正規表現 / RegularExpressions - 3 - Captures


C# 入門 & 実践 / C sharp