この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「TIPS:文字列を全角/半角に変換するには?(VB.NET関数活用)」では、VB用のStrConv関数(Microsoft.VisualBasic名前空間)により、文字列内の全角文字を半角文字に変換する方法を示しているが、このStrConv関数は全角→半角の変換可能な文字をすべて変換してしまう。ここでは、全角カタカナはそのままに、全角英数字のみを半角にする方法について解説する。
ここで紹介するのは、文字列内の特定の文字に対してのみ、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関数活用)
Copyright© Digital Advantage Corp. All Rights Reserved.