2012-11-30 15 views
5

私は文字列を分割することについて質問があります。私は文字列を分割したいが、文字列内で文字列を見るときは ""空のスペースを分割して削除しないでください。配列を分割して空の空を削除する

マイ文字列:

String tmp = "abc 123 \"Edk k3\" String;"; 

結果:

1: abc 
2: 123 
3: Edkk3 // don't split after "" and remove empty spaces 
4: String 

結果のための私のコードが、私は "" で空のスペースを削除する方法がわからない

var tmpList = tmp.Split(new[] { '"' }).SelectMany((s, i) => 
       { 
        if (i % 2 == 1) return new[] { s }; 
        return s.Split(new[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries); 
       }).ToList(); 

かしかし、これは ""表示されないので、すべてを分割します。

string[] tmpList = tmp.Split(new Char[] { ' ', ';', '\"', ',' }, StringSplitOptions.RemoveEmptyEntries); 

答えて

8

.Replace(」」、 『』)

String tmp = @"abc 123 ""Edk k3"" String;"; 
var tmpList = tmp.Split(new[] { '"' }).SelectMany((s, i) => 
{ 
    if (i % 2 == 1) return new[] { s.Replace(" ", "") }; 
    return s.Split(new[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries); 
}).ToList(); 
0

string.Splitあなたは"にあるものを無視して、それを言うことができないとして、あなたは何をしたいのかには適していませんを追加します。

私はRegexと一緒に行かないでしょう。これは(長い文字列に対して)複雑でメモリを消費することがあります。

独自のパーサーを実装する - 状態マシンを使用して、引用部分内にあるかどうかを追跡します。

0

正規表現を使用できます。分割するのではなく、保持したいものを指定します。

例:

string tmp = "abc 123 \"Edk k3\" String;"; 

MatchCollection m = Regex.Matches(tmp, @"""(.*?)""|([^ ]+)"); 

foreach (Match s in m) { 
    Console.WriteLine(s.Groups[1].Value.Replace(" ", "") + s.Groups[2].Value); 
} 

出力:

abc 
123 
Edkk3 
String; 
関連する問題