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

» 2010年08月19日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「.NET TIPS」のインデックス

連載目次

 「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プロパティより、マッチした部分の文字列(全角英数字のみの文字列となっているはず)を取得できる。

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

「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。