.NET TIPS

全角英数字のみを半角に変換するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2010/08/19

 「TIPS:文字列を全角/半角に変換するには?(VB.NET関数活用)」では、VB用のStrConv関数(Microsoft.VisualBasic名前空間)により、文字列内の全角文字を半角文字に変換する方法を示しているが、このStrConv関数は全角→半角の変換可能な文字をすべて変換してしまう。ここでは、全角カタカナはそのままに、全角英数字のみを半角にする方法について解説する。

Regex.Replaceメソッドによる置き換え

 ここで紹介するのは、文字列内の特定の文字に対してのみ、StrConv関数による処理を行うという方法だ。

 Regexクラス(System.Text.RegularExpressions名前空間)のReplaceメソッドを使えば、指定した正規表現にマッチした部分の文字列を、独自のメソッドによって加工することができる。具体的には、以下のような呼び出し手順になる。

Regex re = new Regex(<正規表現パターン>);
string output = re.Replace(<対象文字列>, <独自メソッド名>);
Dim re As Regex = New Regex(<正規表現パターン>)
Dim output As String = re.Replace( _
                    <対象文字列>, AddressOf <独自メソッド名>)
独自メソッドを利用するReplaceメソッドの呼び出し方法(上:C#、下:VB)

 この場合、<対象文字列>内の一部分が<正規表現パターン>にマッチするたびに、<独自メソッド名>で指定したメソッドが呼び出され、その戻り値により、その部分が置き換えられるというわけだ。

 実際には、<正規表現パターン>に全角英数字を表す正規表現を記述し、<独自メソッド名>で示す独自メソッドでは、StrConv関数により全角→半角変換を行えばよい。以上を実装したものが、次のサンプル・プログラムだ。

// abc123ToHankaku.cs

using System;
using System.Text.RegularExpressions;
using Microsoft.VisualBasic;

class Program {
  static void Main() {
    new Program().Run();
  }

  void Run() {
    string input = "全角マジリ:0123456789AbCdEfGh −";
    string output = abc123ToHankaku(input);

    Console.WriteLine(output);
    // 出力:全角マジリ:0123456789AbCdEfGh -
  }

  static string abc123ToHankaku(string s) {

    Regex re = new Regex("[0-9A-Za-z:− ]+");
    string output = re.Replace(s, myReplacer);

    return output;
  }

  static string myReplacer(Match m) {
    return Strings.StrConv(m.Value, VbStrConv.Narrow, 0);
  }
}

// コンパイル方法:csc /r:Microsoft.VisualBasic.dll abc123ToHankaku.cs
' abc123ToHankaku.vb

Imports System
Imports System.Text.RegularExpressions

Class Program
    Shared Sub Main()
        Dim p As New Program
        p.Run()
    End Sub

    Sub Run()
        Dim input As String = _
                 "全角マジリ:0123456789AbCdEfGh −"
        Dim output As String = abc123ToHankaku(input)

        Console.WriteLine(output)
        ' 出力:全角マジリ:0123456789AbCdEfGh -
    End Sub

    Shared Function abc123ToHankaku(ByVal s As String) As String

        Dim re As Regex = New Regex("[0-9A-Za-z:,− ]+")
        Dim output As String = re.Replace(s, AddressOf myReplacer)

        Return output
    End Function

    Shared Function myReplacer(ByVal m As Match) As String
        Return Strings.StrConv(m.Value, VbStrConv.Narrow, 0)
    End Function
End Class

' コンパイル方法:vbc abc123ToHankaku.vb
全角英数文字を半角に変換するサンプル・プログラム(上:C#、下:VB)

 このプログラムでは、<正規表現パターン>として、

[0-9A-Za-z:− ]+

を指定しているが、これは0〜9、A〜Z、a〜z、「:」、「−」、全角スペースのいずれかの1文字以上の繰り返しを意味する(つまりは連続する英数文字+αのみで構成される文字列)。

 また、Replaceメソッドの第2引数には、厳密には、MatchEvaluatorデリゲート(System.Text.RegularExpressions名前空間)のインスタンスを指定するが、コンパイラが自動的に補完してくるので、C#ではメソッド名のみでよい(VBではメソッド名の前にAddressOf演算子が必要)。

 実際の置き換えを行うメソッド(ここではmyReplacerメソッド)の引数には、正規表現による一致結果がMatchクラス(System.Text.RegularExpressions名前空間のオブジェクトとして渡され、そのValueプロパティより、マッチした部分の文字列(全角英数字のみの文字列となっているはず)を取得できる。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:StrConv関数(Microsoft.VisualBasic名前空間)
使用ライブラリ:Regexクラス(System.Text.RegularExpressions名前空間)
使用ライブラリ:MatchEvaluatorデリゲート(System.Text.RegularExpressions名前空間)
使用ライブラリ:Matchクラス(System.Text.RegularExpressions名前空間)
関連TIPS:文字列を全角/半角に変換するには?(VB.NET関数活用)

この記事と関連性の高い別の.NET TIPS
文字列を全角/半角に変換するには?(VB.NET関数活用)
文字列をひらがな/カタカナに変換するには?(VB.NET関数活用)
正規表現を使って文字列から部分文字列を取り除くには?
文字列の全角/半角をチェックするには?
文字列の長さを取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH