|
.NET TIPS
正規表現を使って文字列から部分文字列を取り除くには?[C#、VB]
デジタルアドバンテージ 遠藤 孝信
2007/04/19 |
|
|
「TIPS:正規表現を使って部分文字列を取得するには?」では、Regexクラス(System.Text.RegularExpressions名前空間)のMatchメソッドを使用した部分文字列の取り出しについて解説したが、これと並び比較的よく必要となる文字列処理に、部分文字列の削除がある。
Regexクラスには正規表現のパターンにマッチした部分文字列を削除するというメソッドは用意されていないが、マッチした部分を別の文字列に置き換えるReplaceメソッドが用意されている。このため、置き換える文字列として空の文字列を指定することにより、パターンにマッチした部分文字列を取り除くことができる。
パターンにマッチした文字列を別の文字列に置き換えるReplaceメソッド
ここではHTML内のタグ部分を取り除き、テキストのみを残したい場合を例に取って解説しよう。HTMLのタグ部分は正規表現を使って簡易的に「<.*?>」と記述することができる*。
* 「<.*?>」では、「<……<……>……>」のように「<>」のペアが入れ子になっている場合に「<……<……>」の部分にしかマッチしない。このような入れ子はJavaScriptコード内で現れることが多いため、実際にHTMLからテキストのみを取り出す場合には、あらかじめJavaScriptコード部分を削除しておく(例えば後述のサンプル・プログラムのように「<(no)?script.*?script>」にマッチする部分を空文字列に置き換えておく)とよいだろう。
|
RegexクラスのReplaceメソッドを使用するには、次のようにまずパターンを指定してRegexクラスのインスタンスを作成し、それに対してReplaceメソッドを呼び出す。メソッドのパラメータには、マッチングの対象となる元の文字列と、置き換える文字列(ここでは空文字列)を指定する。Replaceメソッドの戻り値が、置き換えられた後の文字列となる。
Regex re = new Regex("<.*?>", RegexOptions.Singleline);
string output = re.Replace(html, "");
|
Dim re As New Regex("<.*?>", RegexOptions.Singleline)
Dim output As String = re.Replace(html, "")
|
|
Regexインスタンスの作成とReplaceメソッドの呼び出し(上:C#、下:VB) |
変数htmlには、処理対象となる文字列(ここではHTMLのすべての内容)が代入されているものとする。 |
HTMLのタグは複数行にわたって記述される場合もあるため、RegexOptions.Singlelineオプションが必要になる。このオプションにより、パターン内の「.」は改行文字にもマッチングするようになる。
HTMLからタグ部分を取り除くサンプル・プログラム
次のサンプル・プログラムは、@ITのトップページ(index.html)を読み込み、JavaScript部分およびすべてのタグ部分を取り除いて表示する。
// regexreplace.cs
using System;
using System.Net;
using System.Text.RegularExpressions;
class RegexReplace {
static void Main() {
// @ITのトップページを取得
WebClient wc = new WebClient();
string html = wc.DownloadString("http://www.atmarkit.co.jp/");
// <script>〜</script>や<noscript>〜</noscript>
Regex re1 = new Regex("<(no)?script.*?script>",
RegexOptions.IgnoreCase | RegexOptions.Singleline);
// すべてのタグ
Regex re2 = new Regex("<.*?>", RegexOptions.Singleline);
html = re1.Replace(html, "");
html = re2.Replace(html, "");
Console.WriteLine(html);
}
}
// コンパイル方法:csc regexreplace.cs
|
|
HTMLのタグを削除するC#のサンプル・プログラム(regexreplace.cs) |
|
' regexreplace.vb
Imports System
Imports System.Net
Imports System.Text.RegularExpressions
Class RegexReplace
Shared Sub Main()
' @ITのトップページを取得
Dim wc As New WebClient()
Dim html As String = _
wc.DownloadString("http://www.atmarkit.co.jp/")
' <script>〜</script>や<noscript>〜</noscript>
Dim re1 As New Regex("<(no)?script.*?script>", _
RegexOptions.IgnoreCase Or RegexOptions.Singleline)
' すべてのタグ
Dim re2 As New Regex("<.*?>", RegexOptions.Singleline)
html = re1.Replace(html, "")
html = re2.Replace(html, "")
Console.WriteLine(html)
End Sub
End Class
' コンパイル方法:vbc regexreplace.vb
|
|
HTMLのタグを削除するVBのサンプル・プログラム(regexreplace.vb) |
|
なお、「TIPS:正規表現を使って部分文字列を取得するには?」で使用したMatchメソッドや、今回のReplaceメソッドには、Regexクラスのインスタンス作成が不要な静的メソッドのバージョンも用意されている。
output = Regex.Replace(html, "<.*?>", "", RegexOptions.Singleline);
|
output = Regex.Replace(html, "<.*?>", "", RegexOptions.Singleline)
|
|
静的メソッド版のReplaceメソッドの記述例(上:C#、下:VB) |
このバージョンを使うとコードは短くなるが、同じパターンでReplaceメソッドを複数の文字列に対して繰り返し使用するような場合には、あらかじめインスタンスを作成した方が実行効率は良い。
カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Regexクラス(System.Text.RegularExpressions名前空間)
使用ライブラリ:RegexOptions列挙体(System.Text.RegularExpressions名前空間)
関連TIPS:正規表現を使って部分文字列を取得するには?
|
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間