文字列を文字列により分割するには?(VB.NET関数活用).NET TIPS

» 2005年06月24日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]
.NET TIPS
Insider.NET


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

連載目次

 ある文字列を特定の「文字」により分割するには、Stringクラス(System名前空間)のSplitメソッドが利用できる(使用例については「TIPS:メソッドに可変長パラメータを渡すには?」を参照 )。しかし、Splitメソッドでは文字列を「文字列」により分割することはできない。

 文字列を文字列により分割したい場合には、正規表現が利用可能なRegexクラス(System.Text.RegularExpressions名前空間)のSplitメソッドを使用することもできるが、正規表現を使うまでもないような用途には、VB.NETのSplit関数が使える。

 本稿では、VB.NETおよびC#からVB.NETのSplit関数を利用して文字列を分割する方法について解説する。

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

Split関数により文字列を文字列で分割するVB.NETのサンプル・プログラム(vbsplit.vb)
vbsplit.vbのダウンロード

 このサンプル・プログラムの最後のコメント部分(「' リjkl」)から分かるように、文字列に濁点などを含む半角カタカナ文字列が含まれている場合(文字列の全角表記と半角表記で文字数が異なる場合)、テキスト・モードでは正しく分割されないようなので注意が必要だ。

C#におけるSplit関数を使った文字列の分割

 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のSplit関数を使用したC#のサンプル・プログラム(vbsplit.cs)
vbsplit.csのダウンロード

 なお、VB.NETでは第2パラメータ以降を省略してSplit関数を呼び出すこともできるが、C#ではパラメータを省略することはできない。

カテゴリ:クラス・ライブラリ 処理対象:文字列
カテゴリ:C# 処理対象:VB.NET関数
使用ライブラリ:Split関数(Microsoft.VisualBasic名前空間)
使用ライブラリ:CompareMethod列挙体(Microsoft.VisualBasic名前空間)
関連TIPS:メソッドに可変長パラメータを渡すには?
関連TIPS:VB.NET固有の関数をC#で使用するには?


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

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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