ある文字列を特定の「文字」により分割するには、Stringクラス(System名前空間)のSplitメソッドが利用できる(使用例については「TIPS:メソッドに可変長パラメータを渡すには?」を参照 )。しかし、Splitメソッドでは文字列を「文字列」により分割することはできない。
文字列を文字列により分割したい場合には、正規表現が利用可能なRegexクラス(System.Text.RegularExpressions名前空間)のSplitメソッドを使用することもできるが、正規表現を使うまでもないような用途には、VB.NETのSplit関数が使える。
本稿では、VB.NETおよびC#からVB.NETのSplit関数を利用して文字列を分割する方法について解説する。
Split関数は文字列(第1パラメータ)を、区切り文字列(第2パラメータ)により分割し、分割された文字列(=部分文字列)を配列として返す。以下にその記述例を示す。
Dim parts As String()
parts = Split(target, delimiter, -1, CompareMethod.Binary)
Split関数の第3パラメータには、取得する部分文字列の数を指定する。ここで「-1」を指定した場合には、すべての部分文字列を含む配列を取得できる。
第4パラメータにはCompareMethod.Binary(バイナリ・モード)かCompareMethod.Text(テキスト・モード)を指定する。バイナリ・モードの場合には、区切り文字列と完全に一致した部分でのみ分割されるが、テキスト・モードでは、大文字/小文字、全角/半角、ひらがな/カタカナの区別なしに文字列が分割される*。
* より詳細には、バイナリ・モードではCompareOptions列挙体で定義されている文字列比較オプションのうち、「IgnoreCase」「IgnoreKanaType」「IgnoreWidth」の組み合わせが区切り文字の比較方法となる。テキスト・モードでは「Ordinal」のみが比較方法となる。
次のVB.NETのサンプル・プログラムは、これらの2つのモードの違いを示している。
' vbsplit.vb
Imports System
Imports Microsoft.VisualBasic
Public Class VBStringsSplit
Shared Sub Main()
Dim delimiter As String = "くぎり"
Dim target As String = "abcくぎりdefクギリghiクギリjkl"
Dim parts As string()
parts = Split(target, delimiter, -1, CompareMethod.Binary)
For Each s As String In parts
Console.WriteLine(s)
Next
' 出力:
' abc
' defクギリghiクギリjkl
parts = Split(target, delimiter, -1, CompareMethod.Text)
For Each s As String In parts
Console.WriteLine(s)
Next
' 出力:
' abc
' def
' ghi
' リjkl
End Sub
End Class
' コンパイル方法:vbc vbsplit.vb
このサンプル・プログラムの最後のコメント部分(「' リjkl」)から分かるように、文字列に濁点などを含む半角カタカナ文字列が含まれている場合(文字列の全角表記と半角表記で文字数が異なる場合)、テキスト・モードでは正しく分割されないようなので注意が必要だ。
VB.NETの関数は、C#からも利用できる。その具体的な利用方法については「TIPS:VB.NET固有の関数をC#で使用するには?」を参照していただきたい。
C#では、Split関数はStringsクラス(Microsoft.VisualBasic名前空間)の静的メソッドであるSplitメソッドとして利用可能だ。テキスト/バイナリ・モードはCompareMethod列挙体(Microsoft.VisualBasic名前空間)の値により指定する。
以下に上記のVB.NETのサンプル・プログラムと同等のC#のプログラムを示す。
// vbsplit.cs
using System;
using Microsoft.VisualBasic;
public class VBStringsSplit {
static void Main() {
string target = "abcくぎりdefクギリghiクギリjkl";
string delimiter = "くぎり";
string[] parts;
parts = Strings.Split(
target, delimiter, -1, CompareMethod.Binary);
foreach (string s in parts) {
Console.WriteLine(s);
}
// 出力:
// abc
// defクギリghiクギリjkl
parts = Strings.Split(
target, delimiter, -1, CompareMethod.Text);
foreach (string s in parts) {
Console.WriteLine(s);
}
// 出力:
// abc
// def
// ghi
// リjkl
}
}
// コンパイル方法:csc /r:Microsoft.VisualBasic.dll vbsplit.cs
なお、VB.NETでは第2パラメータ以降を省略してSplit関数を呼び出すこともできるが、C#ではパラメータを省略することはできない。
カテゴリ:クラス・ライブラリ 処理対象:文字列
カテゴリ:C# 処理対象:VB.NET関数
使用ライブラリ:Split関数(Microsoft.VisualBasic名前空間)
使用ライブラリ:CompareMethod列挙体(Microsoft.VisualBasic名前空間)
関連TIPS:メソッドに可変長パラメータを渡すには?
関連TIPS:VB.NET固有の関数をC#で使用するには?
Copyright© Digital Advantage Corp. All Rights Reserved.