はじめまして。
調べてみたのですがちょっと分らず、
下記のような文字列の分割処理が必要となり、
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"
文字列の分割処理
Re: 文字列の分割処理
ちょっと確認なのですが・・・
STR = A B "C D E" F G "H I J" K
みたいな場合は、ARRAYの中身がどうなるのが正しいですか?
STR = A B "C D E" F G "H I J" K
みたいな場合は、ARRAYの中身がどうなるのが正しいですか?
Re: 文字列の分割処理
詳細な仕様が分からないので、色々とこちらで推測して書いてみました。合っているかどうかは分かりません。
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);
}
}
}
Re: 文字列の分割処理
とりあえず,文字の分割となると正規表現は基本だよね,ということで書いてみました。
required: .NET Framework 3.5 or later
LINQ使っているのでコード自体は.NET Framework 3.5以上が必要ですが,
正規表現自体は.NET Framework 1.0でも動作すると思います。
なお,C#で全部大文字の識別子というのは普通使わないので (Camel Case or Pascal Caseを使います),
コード中ではSTRとARRAYをCamel Caseに変更しています。
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);
}
}
}正規表現自体は.NET Framework 1.0でも動作すると思います。
なお,C#で全部大文字の識別子というのは普通使わないので (Camel Case or Pascal Caseを使います),
コード中ではSTRとARRAYをCamel Caseに変更しています。
-
ルイ子
Re: 文字列の分割処理
ご返信ありがとうございます。
とりあえず、下記の場合の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"
とりあえず、下記の場合の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: 文字列の分割処理
えーっと,「使えませんでした」の意図するところは何でしょうか。ルイ子 さんが書きました: 正規表現は使えませんでした。
題意と異なる結果は出ていないはずですが……。
-
ルイ子
Re: 文字列の分割処理
YuO さん、ただ単にそうゆう仕様でした。
先に説明文に記すべきでした。ごめんなさい。
こうゆう方法もあるのですね。勉強させていただきました。
本当にありがとうございました。
バグ さん、これでいけそうです。
ありがとうございました。
YuOさん、バグさん本当に感謝致します。ありがとうございました。
先に説明文に記すべきでした。ごめんなさい。
こうゆう方法もあるのですね。勉強させていただきました。
本当にありがとうございました。
バグ さん、これでいけそうです。
ありがとうございました。
YuOさん、バグさん本当に感謝致します。ありがとうございました。