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