文字列の分割処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ルイ子

文字列の分割処理

#1

投稿記事 by ルイ子 » 14年前

はじめまして。
調べてみたのですがちょっと分らず、
下記のような文字列の分割処理が必要となり、
C#で簡単に実現する方法はないでしょうか?
地道にアルゴを考えないといけないものでしょうか?
(C#は論外でしたら申し訳ありません)
ご教授のほど、アドバイスのほど、何卒宜しくお願いします。

<<やりたいこと>>
1.区切り文字はスペース
2.ダブルクォーテーション内のスペースは区切り文字として扱わない
3.区切った文字列は配列に格納する

STR=A B "C D E" F

ARRAY[0]="A"
ARRAY[1]="B"
ARRAY[2]=""C D E""
ARRAY[3]="F"

アバター
バグ
記事: 130
登録日時: 15年前
住所: 愛媛県
連絡を取る:

Re: 文字列の分割処理

#2

投稿記事 by バグ » 14年前

Stringクラスのメンバを調べると幸せになれるかもしれません

アバター
バグ
記事: 130
登録日時: 15年前
住所: 愛媛県
連絡を取る:

Re: 文字列の分割処理

#3

投稿記事 by バグ » 14年前

ちょっと確認なのですが・・・

STR = A B "C D E" F G "H I J" K

みたいな場合は、ARRAYの中身がどうなるのが正しいですか?

アバター
バグ
記事: 130
登録日時: 15年前
住所: 愛媛県
連絡を取る:

Re: 文字列の分割処理

#4

投稿記事 by バグ » 14年前

詳細な仕様が分からないので、色々とこちらで推測して書いてみました。合っているかどうかは分かりません。

コード:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(String[] args)
    {
        List<String> ARRAY = new List<String>();
        String STR = "A B \"C D E\" F";
        Split(ref STR, ARRAY);
        for (Int32 i = 0; i < ARRAY.Count; ++i)
            Console.WriteLine("ARRAY[{0}] = {1}", i, ARRAY[i]);
    }

    static void Split(ref String str, List<String> list)
    {
        str = str.Trim();
        Int32 start = str.IndexOf("\"");
        if (start > 0)
        {
            foreach (String itm in str.Substring(0, start - 1).Split(new Char[] { ' ' }))
                list.Add(itm);
        }

        Int32 finish = str.IndexOf("\"", start + 1);
        if (finish > 0)
        {
            list.Add(str.Substring(start + 1, finish - start - 1));
            str = str.Remove(0, finish + 1);
            Split(ref str, list);
        }
        else if (str.Length > 0)
        {
            foreach (String itm in str.Split(new Char[] { ' ' }))
                list.Add(itm);
        }
    }
}

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: 文字列の分割処理

#5

投稿記事 by YuO » 14年前

とりあえず,文字の分割となると正規表現は基本だよね,ということで書いてみました。
required: .NET Framework 3.5 or later

コード:

using System;
using System.Linq;
using System.Text.RegularExpressions;

class Program
{
	private static readonly Regex _match = new Regex(
		@"((""[^""]*"")|[^ ])((""[^""]*"")*[^ ]?)*",
		RegexOptions.Compiled | RegexOptions.ExplicitCapture);

	static void Main ()
	{
		const string str = @"A B ""C D E"" F";
		string[] array = _match
			.Matches(str)
			.Cast<Match>()
			.Select(m => m.Value)
			.ToArray();

		foreach (var value in array)
		{
			Console.WriteLine(value);
		}
	}
}
LINQ使っているのでコード自体は.NET Framework 3.5以上が必要ですが,
正規表現自体は.NET Framework 1.0でも動作すると思います。

なお,C#で全部大文字の識別子というのは普通使わないので (Camel Case or Pascal Caseを使います),
コード中ではSTRとARRAYをCamel Caseに変更しています。

ルイ子

Re: 文字列の分割処理

#6

投稿記事 by ルイ子 » 14年前

ご返信ありがとうございます。
とりあえず、下記の場合のARRAYの中身を記します。
やはり一発で簡単にはいかないようですね。
ちなみにVisual Studio 2010 を使用してます。

STR = A B "C D E" F G "H I J" K

ARRAY[0]="A"
ARRAY[1]="B"
ARRAY[2]=""C D E""
ARRAY[3]="F"
ARRAY[4]="G"
ARRAY[5]=""H I J""
ARRAY[6]="K"

ルイ子

Re: 文字列の分割処理

#7

投稿記事 by ルイ子 » 14年前

YuOさん、すいません。
正規表現は使えませんでした。
ご返信くださりありがとうございました。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: 文字列の分割処理

#8

投稿記事 by YuO » 14年前

ルイ子 さんが書きました: 正規表現は使えませんでした。
えーっと,「使えませんでした」の意図するところは何でしょうか。
題意と異なる結果は出ていないはずですが……。

ルイ子

Re: 文字列の分割処理

#9

投稿記事 by ルイ子 » 14年前

YuO さん、ただ単にそうゆう仕様でした。
先に説明文に記すべきでした。ごめんなさい。
こうゆう方法もあるのですね。勉強させていただきました。
本当にありがとうございました。

バグ さん、これでいけそうです。
ありがとうございました。

YuOさん、バグさん本当に感謝致します。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る