C#で正規表現を使って文字列を置換してみた

文字列の変換(置換)といえば、正規表現です。C#で正規表現を使って文字列の変換をしてみました。

目次

  1. HTMLタグを除去
  2. タブを除去
  3. 空白しかない行の空白を除去

HTMLタグを除去

そのものずばり、文字列からHTMLタグを除去するサンプルコードがMSDNのサイトにありました。 実際に試してみましょう。下記のようなコンソールアプリを作ります。アプリの機能としては、標準入力から入力した文字列(HTMLデータ)からHTMLタグを除去して、結果をコンソールに書き出します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

namespace regex_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            TextReader inputData = Console.In; // 標準入力のTextReaderを作ります
            string inputText = inputData.ReadToEnd(); // 標準入力からの入力を最後まで読み込みます

            string pattern = @"<.*?>";
            string result = Regex.Replace(inputText, pattern, string.Empty, RegexOptions.Singleline); // HTMLタグの除去

            Console.Write(result);
        }
    }
}

某サイトのHTMLファイルをinput.htmlとして保存します。コマンドウィンドウで下図のようにパイプを使ってアプリにinput.htmlの中身を渡します。そして、その出力をoutput.txtに書き出します。 151114-1-00 読み込ませるHTMLファイル(input.html)の中身は下図のようになっています。 151114-1-01 出力されたもの(output.txt)を開いてみると、下図のようにHTMLタグが除去されました。 151114-1-02 MSDNのサイトではJavaScriptが記載されているものについては、正しく動作しない可能性があるので注意するよう書かれています。

タブを除去

タブを除去してみます。タブはエスケープ文字で\tで表します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

namespace regex_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            TextReader inputData = Console.In; // 標準入力のTextReaderを作ります
            string inputText = inputData.ReadToEnd(); // 標準入力からの入力を最後まで読み込みます

            string pattern = @"\t";
            string result = Regex.Replace(inputText, pattern, string.Empty, RegexOptions.Singleline); // TABの除去

            Console.Write(result);
        }
    }
}

使い方とは、HTMLタグの除去のアプリと同じです。下図の様なタブがいっぱい書かれたテキストファイルを入力してみます。 151114-1-03 そうすると、出力は下図のようになります。タブが消えました。 151114-1-04

空白しかない行の空白を除去

空白しかない行の空白だけを除去したいこと、よくありますよね。これを正規表現でやろうとすると上の例よりもちょっと複雑になります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using System.IO;

namespace regex_trial2
{
    class Program
    {
        static void Main(string[] args)
        {
            TextReader inputData = Console.In; // 標準入力のTextReaderを作ります
            string inputText = inputData.ReadToEnd(); // 標準入力からの入力を最後まで読み込みます

            string ResultText = Regex.Replace(inputText, @"(^[ \ ]*?)(\r?$)", "$2", RegexOptions.Multiline);
            Console.Write(ResultText);
        }
    }
}

正規表現のうち、^は行頭です。[]は角括弧内の文字のいずれかです。*?は直前のパターンの繰り返しです。()で括って改行コードとそれ以外の文字列(半角スペースと全角スペースの組み合わせ)に分けました。そして、変換後の文字列は改行コードだけになるように指定しました。変換後文字列の$2というのは、()で分けた正規表現の2番目の要素を意味します。 いくつか気をつける点があります。

  • 1行ごとに処理するので、RegexOptions.Multilineを指定します。

  • 正規表現では、半角スペースはエスケープすること。(半角スペース)ではダメで、\ (半角スペース)にしなければなりません。

  • 正規表現の$は行末を表すが実際には\n(LF)のこと。WindowsはCR+LFの組み合わせが標準ですが、C#の正規表現では$はLFだけに反応します。というわけで、改行は\r?$とします。

実際に、下図のデータを入力してみます。 151114-1-05 そうすると、下図の様にスペースだけの行からスペースが無くなりました。 151114-1-06

公開日

広告