全部博文(43)
分类:
2006-07-11 20:17:55
正規表現を使って文字列を検索する(ここでは正規表現の説明はしません。.NET Frameworkの正規表現はPerl5の正規表現に対応するようにデザインされているということなので、Perlの正規表現を理解していれば問題ありません。なお.NET Frameworkの正規表現については「.NET Framework の正規表現」や「正規表現言語要素」、Perlの正規表現については「Perl の正規表現のチュートリアル」などを参考にしてください。具体例としては、「Perl正規表現雑技」が参考になります。)
正規表現を使って文字列の検索を行い、正規表現と一致する対象が入力文字列内で見つかるかどうかを調べるには、RegexクラスのIsMatchメソッドを使用します。
次の例ではTextBox1に入力された文字列内にメールアドレスっぽいものがあるか調べます。
[VB.NET]
'Imports System.Text.RegularExpressions
'が宣言されているものとする
'TextBox1に入力された文字列内にメールアドレスっぽいものがあるか調べる
'このパターンは CGI RESCUE(http://www.rescue.ne.jp) を
'参考にさせていただきました。
If Regex.IsMatch(TextBox1.Text, "\b[-\w.]+@[-\w.]+\.[-\w]+\b") Then
Console.WriteLine("見つかったよ。")
End If
[C#]
//using System.Text.RegularExpressions;
//が宣言されているものとする
//TextBox1に入力された文字列内にメールアドレスっぽいものがあるか調べる
//このパターンは CGI RESCUE(http://www.rescue.ne.jp) を
//参考にさせていただきました。
if (Regex.IsMatch(TextBox1.Text, @"\b[-\w.]+@[-\w.]+\.[-\w]+\b"))
{
Console.WriteLine("見つかったよ。");
}
正規表現を使って文字列の検索し、検索された文字列を取得するには、RegexクラスとMatchメソッド(またはMatchsメソッド)を使用します。一致した要素はMatchオブジェクトとして返されます。
次の例ではTextBox1に入力された文字列からメールアドレスっぽい文字列をすべて検索し、表示します。
[VB.NET]
'Imports System.Text.RegularExpressions
'が宣言されているものとする
'正規表現パターンを指定してRegexクラスのインスタンスを作成
'このパターンは CGI RESCUE(http://www.rescue.ne.jp) を
'参考にさせていただきました。
Dim r As Regex
r = New Regex("\b[-\w.]+@[-\w.]+\.[-\w]+\b")
'TextBox1.Text内で正規表現と一致する対象を1つ検索
Dim m As Match
m = r.Match(TextBox1.Text)
'次のように一致する対象をすべて検索することもできる
'Dim mc As MatchCollection = r.Matches(TextBox1.Text)
While m.Success
'一致した対象が見つかったとき
'キャプチャした部分文字列を表示
Console.WriteLine(m.Value)
'次に一致する対象を検索
m = m.NextMatch()
End While
[C#]
//using System.Text.RegularExpressions;
//が宣言されているものとする
//正規表現パターンを指定してRegexクラスのインスタンスを作成
//このパターンは CGI RESCUE(http://www.rescue.ne.jp) を
//参考にさせていただきました。
Regex r;
r = new Regex(@"\b[-\w.]+@[-\w.]+\.[-\w]+\b");
//TextBox1.Text内で正規表現と一致する対象を1つ検索
Match m;
m = r.Match(TextBox1.Text);
//次のように一致する対象をすべて検索することもできる
//Dim mc As MatchCollection = r.Matches(TextBox1.Text)
while (m.Success)
{
//一致した対象が見つかったとき
//キャプチャした部分文字列を表示
Console.WriteLine(m.Value);
//次に一致する対象を検索
m = m.NextMatch();
}
次にグループ化の例を示します。正規表現でグループ化を指定するには、「(?<(数字または名前)>)」のようにします(詳しくはこちら)。正規表現に一致したグループはMatchクラスのGroupsプロパティで取得できます。
下の例はTextBox1に入力された文字列を検索して、...でリンクされているリンク先のURLとリンクされている文字列をすべて調べ、結果を出力するものです。なおヘルプには、href="..."を検索する「HREFS のスキャン」という例や、Match.Resultメソッドを使った「URL 情報の抽出」という例が紹介されています。
[VB.NET]
'Imports System.Text.RegularExpressions
'が宣言されているものとする
Dim r As Regex
Dim m As Match
''正規表現パターンとオプションを指定して
'Regexクラスのインスタンスを作成
r = New Regex( _
"]*href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>[^\s>]+))[^>]*>(?<2>[^<]*)", _
RegexOptions.IgnoreCase Or RegexOptions.Compiled)
'正規表現と一致する対象を1つ検索
m = r.Match(TextBox1.Text)
While m.Success
'正規表現に一致したグループ(1)の文字列と位置を表示
Console.WriteLine(("リンク先:" + m.Groups(1).Value + vbLf + _
"リンクされている文字列:" + m.Groups(2).Value))
'Resultメソッドを使うと次のようにもできる
'Console.WriteLine(m.Result("リンク先:$1" + vbLf + _
' "リンクされている文字列:$2"))
m = m.NextMatch()
End While
[C#]
//using System.Text.RegularExpressions;
//が宣言されているものとする
Regex r;
Match m;
//'正規表現パターンとオプションを指定して
//Regexクラスのインスタンスを作成
r = new Regex(
@"]*href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>[^\s>]+))[^>]*>(?<2>[^<]*)",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
//正規表現と一致する対象を1つ検索
m = r.Match(TextBox1.Text);
while (m.Success)
{
//正規表現に一致したグループ(1)の文字列と位置を表示
Console.WriteLine("リンク先:" + m.Groups[1].Value
+ "\nリンクされている文字列:" + m.Groups[2].Value);
//Resultメソッドを使うと次のようにもできる
//Console.WriteLine(m.Result("リンク先:$1\nリンクされている文字列:$2"));
m = m.NextMatch();
}