.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メソッドを複数の文字列に対して繰り返し使用するような場合には、あらかじめインスタンスを作成した方が実行効率は良い。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Regexクラス(System.Text.RegularExpressions名前空間)
使用ライブラリ:RegexOptions列挙体(System.Text.RegularExpressions名前空間)
関連TIPS:正規表現を使って部分文字列を取得するには?

この記事と関連性の高い別の.NET TIPS
文字列から特定の文字列を取り除くには?[C#、VB]]
正規表現を使って文字列を置換するには?[C#/VB]
正規表現を使って部分文字列を取得するには?
正規表現を使ってパターンに一致する全ての文字列を抽出するには?[C#/VB]
正規表現を使って文字列がパターンに一致するか調べるには?[C#/VB]
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間