マージ型文字列のデリミタ2文字以上のSplit関数は実現可能か?

このQ&Aのポイント
  • String::Splitはwchar_tのように1文字だけしか使えないため、2文字以上のデリミタに対応したsplit関数を探しています。
  • 以下のソースコードでは、2文字以上の任意のデリミタでマージ型文字列を配列にしたいです。
  • .NETはVista以降でも廃れることはないため、覚えて無意味ではありません。
回答を見る
  • ベストアンサー

マージ型文字列のデリミタ2文字以上のSplit関数のようなものは実現できますか?

素人で間違っているかもしれませんが、String::Splitは wchar_tのように1文字だけしか使えないので、\r\nのような2文字以上のデリミタに対応しているperlのsplit関数みたいのを探しています。 以下のソースで※ここですの部分で、2文字以上の任意のデリミタでマージ型文字列を配列にしたいです。 .NETは覚えたてですが、Vista以降でも廃れることは無いのでしょうか? 覚えて無意味はきついので・・・ /* VC++2005でperlのようなsplit関数を実現したい 区切り文字は\r\n */ using namespace System; int main( array<String^>^ args ){ String^ str = nullptr; if (1 > args->Length ){ str = "太郎\r\n花子\\純一郎"; } else { str = args[0]; } // strマージ文字列をPerlのsplit関数のようなもので、以下のようなnamesを作成したい。 // $names = split /\r\n/ $str; <=※ここです。 array<String^> ^names = { "太郎", "花子", "純一郎" }; String^ name; for each ( name in names ) { Console::WriteLine("{0}", name); } return 0; }

  • binma
  • お礼率14% (11/78)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

String.Split メソッド (String[], StringSplitOptions) のタイプでメソッド使えば可能ですよ array<string^>^separator = {L"\r\n"}; names = str->Split( separator, System::SptringSplitOptions::RemoveEmptyEntries); Console::WriteLine( L"{0}", names->Length ); for each ( name in names ) {   Console::WriteLine( L"{0}", name ); } といった具合です

binma
質問者

補足

ご指摘どおり、以下のように修正して動作しました。 ありがとうございました。 しかし、コマンドラインで test a\r\nb\r\ncとした場合、splitせず そのままa\r\nb\r\ncと表示されます。 str = L{args[0]};とする必要があるのでしょうか? /* VC++2005でperlのようなsplit関数を実現したい 区切り文字は\r\n */ using namespace System; int main( array<String^>^ args ){ String^ str = nullptr; if (1 > args->Length ){ str = "太郎\r\n花子\r\n純一郎"; } else { str = args[0]; } array<String^>^separator = {L"\r\n"}; //array<String^> ^names = { "太郎", "花子", "純一郎" }; array<String^>^names = str->Split( separator, System::StringSplitOptions::RemoveEmptyEntries); String^ name; for each ( name in names ) { Console::WriteLine("{0}", name); } return 0; }

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

>しかし、コマンドラインで test a\r\nb\r\ncとした場合、splitせず コマンドラインで \r\nと与えても Cで扱う CRやLFには変換されません もし \r\nの文字列を区切りとして与えるのであれば C側でエンコードしてあげましょう if ( args.Length < 1 ) {   str = L"デバッグ\r\n用文字\r\n列\r\n" } else {   str = argv[0];   // "\r" -> '\r'変換   str = str.Replase( L"\\r", L"\r" );   // "\n" -> '\n'変換   str = str.Replase( L"\\n", L"\n" ); } といった具合でしょう …

binma
質問者

補足

以下でうまくいきました。 ありがとうございました。 // "\r" → '\r'変換 str = str->Replace( L"\\r", L"\r" ); // "\n" → '\n'変換 str = str->Replace( L"\\n", L"\n" );

関連するQ&A

  • VBA split(文字列, ★) ★←複数デリミタ指定することできますか?

    VBAのsplit()関数ですが、 デリミタは1つしか指定できないのでしょうか? 例えば、 ------------------ 2005-5/23 19'02"40 ------------------ のような文字列を Perlの様に簡単に分割することは無理でしょうか? Array = split(文字列, /[ :\/\'\"-]/)

  • 文字列をSplitを使って区切りたい。 ","

    "," で区切られた文字列をSplitを使って区切りたいのですが。 例. "abc","123d","fr44","1erg" Dim Arr_Koumoku as string() Dim delimiter as string delimiter = Chr(34) & Chr(44) & Chr(34) 'delimiter = """,""" "← これでも結果は同じだった Arr_Koumoku = Arr_Kaigyo(i).Split(delimiter) とやると。 Arr_Koumoku(0) =   Arr_Koumoku(1) = abc Arr_Koumoku(2) = , Arr_Koumoku(3) = 123d Arr_Koumoku(4) = , Arr_Koumoku(5) = fr44 Arr_Koumoku(6) = , ・・・・ と区切られてしまいます。 Arr_Koumoku(0) ="abc" Arr_Koumoku(1) ="123d" Arr_Koumoku(2) ="fr44" Arr_Koumoku(4) ="1erg" としたいのですが。アドバイスを頂けたら幸いです。 開発環境 WindowsXP SP2 Visual Studio 2005 Standard Edition SP1

  • splitを使ってスペース位置で文字列を区切りたい

    splitを使ってスペース位置で文字列を区切りたいのですが、 String[] word = str.split(" ",0);  //半角空白 のように書くと、全角スペースは区切りとしてみなされず、 String[] word = str.split(" ",0);  //全角空白 のように書くと、半角スペースは区切りとしてみなしてくれません。 全角スペースでも半角スペースでも、スペース位置で文字列を区切りたいのですが、どのように書けばよいのでしょうか?

    • ベストアンサー
    • Java
  • ■str_split()で指定した文字数ではなく、指定した文字までを配列に入れることは可能ですか?

    いつもお世話になっています。 文字列を配列に入れようと思って、str_split()を調べました。 $str = "Hello Friend"; $arr = str_split($str, 3); print_r($arr); の結果は Array ( [0] => Hel [1] => lo [2] => Fri [3] => end ) になりますよね?これを $str = "今日はいい天気です。遠足に行きましょう。楽しかったですね。"; としたときに、「。」までを区切りとして配列に入れることは可能でしょうか? つまり、この後何かしらのことをして、 print_r($arr); をすると、以下のように出力されるようにしたいのです。 今日はいい天気です。 遠足に行きましょう。 楽しかったですね。 str_split()で指定した文字数ではなく、指定した文字までを配列に入れることは可能でしょうか?

    • ベストアンサー
    • PHP
  • Split関数で文字を文割するのはわかるのですが、

    Split関数で文字を文割するのはわかるのですが、 文字を残して一文字一文字表示ってできるのでしょうか 説明が下手ですいません Perl言語を使っています Botで使いたいと思ってます

    • ベストアンサー
    • Perl
  • アクセスのクエリでSplit関数は使えないのですか

    レコードにaaa/bbb/cccと入っていて、 クエリで SELECT Split([テーブル1]![フィールド1],"/") AS test FROM テーブル1; とすると、 式に未定義関数 <関数名> があります。(Error 3085) になります。 VBAでやるとしたら Sub test() Dim str As String str = "aaa/bbb/ccc" Debug.Print Split(str, "/")(1) End Sub のような事がしたいのですが クエリでは無理なのでしょうか?

  • splitでの文字列分割

    文字列中の「,」で分割をしたいのですが 「\,」では分割したくありません このような場合、どのような正規表現をかけばいいのでしょうか? <?php $str = "asd,fgh,qwge\,zxc"; $ary_ary = split("[^\],",$str); print_r($ary_ary); ?> ------結果------ Array ( [0] => as [1] => fg [2] => qwge\,zxc ) いろいろ考えてみましたが 上のようにうまくいきませんでした ご教示おねがいします

    • ベストアンサー
    • PHP
  • 文字列について(続き)

    文字列について、あれから私がベストアンサーに選んだ回答を元に下記のプログラムを作成したのですが私が作成したプログラムで出た結果が下記のようになります。実行例のような結果を出すにはどのようにすればいいのですか?Java初心者なのでお願いします。 作成したプログラムで出た結果 文字列を入力 My name is Taro Sandai. 整数を入力 10 My name is.iadnaS oraT 実行例 文字列を入力 My name is Taro Sandai. 整数を入力 10 My name isdnaS oraT ai. import java.io.*; class K2 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("整数を入力"); String str2 = br.readLine(); int num = Integer.parseInt(str2); String str3 = str1.substring(0,num); String str4 = str1.substring(num); StringBuffer str5 = new StringBuffer(str4); str5.reverse(); System.out.println(str3+str5); } }

    • ベストアンサー
    • Java
  • 【perl】 split関数のセパレータについて

    perlで split関数を使いたいのですがセパレータの定義がうまくいかずに 困っています。 split関数で //\n といった複雑な文字列をセパレータとして認識させるには どうすればよいのでしょうか。 '/' 1文字だけでセパレータとされては意味がなく、 //\n という文字列を ひとまとめでセパレータとして認識させたいと思っています。 みなさま、よろしくお願いします。

    • ベストアンサー
    • Perl
  • ユニコード文字列の分割

    csvやファイルパスをカンマや'\'で分割する関数をユニコードでも 対応できるように改修していのですがやり方が分かりません。 関数のロジックはおおよそ以下の通りです。 (仕事先のセキュリティの関係でソースは持ち出せませんので概要ですが・・・) split(str, item, len, words[item][len], delimiter) char* str: 分割対象の文字列 int item:項目数(上限あり) int len:項目の文字数(上限あり) words[item][len]:文字列を分割、項目として格納する配列 char delimiter:区切り文字 int i=0, j=0; while(*str != NULL){ // 文字列を分割する処理 if(str != delimiter){ words[i][j++] = *str } else if{ words[i][j] = NULL i++; j=0; } ・・・・・・・・・ str++; } // 後処理があります VCの設定がマルチバイト対応だったので問題なかったのですが ユニコードに設定を切り替えるとパスの分割でカタカナの「ソ」 を含む文字列が正しく分割されないという事象が発生しました。 関数内の改修だけで解決する方法があるでしょうか? ある程度プロジェクトが動いているのであまり時間をかけないで 対応する必要があります。 OS: Windows7 SP1 環境: VC++ 2008 MFC

専門家に質問してみよう