88699


**readme.txt**

[code]

    this file is example file
    ----------------------
    ["aaa","bbb","ccc","ddd"]
    
[/code]

というような文字列ファイルから配列を作成するにはどうしたら良いでしょうか？

以下の文字列を取り出して、文字列配列を作成したいです。

[code]

    ["aaa","bbb","ccc","ddd"]
    
[/code]

以下のようなコードで、文字列自体は読み込めますが、文字列配列を作成する方法がわかりません。  
できればJsonを使わずに作成したいです。

[code]

    StreamReader sr = new StreamReader(
        "readme.txt", Encoding.GetEncoding("Shift_JIS"));
    
    string text = sr.ReadToEnd();
    
[/code]

非常にシンプルな文字列になることを想定していて  
例えば、["aaa",["bbb","ccc","ddd"]]のような入れ子構造にはならないことを前提としています。また、複数行には分かれず、1行の文字列の中にすべてのデータが含まれることを想定しています。

ダブルクオーテーションと、カンマで区切られるような文字列のみを、文字列配列に変換できると嬉しいです。


CC BY-SA 4.0
2022-05-08T04:20:43.897
88697
2022-05-13T23:18:53.023
2022-05-13T23:18:53.023
4236
36446
question
c# 正規表現
C#で["aaa","bbb","ccc"]というような文字列から配列を作成するには


テキストファイルの内容が、あらかじめプログラムに優しい(色々な場合分けや例外の無い)ように作られていると仮定すれば、以下のように出来るでしょう。

読み取ったファイル内容全体から`[ ]`で囲った文字列の抽出

[code]

    int start = text.IndexOf('[');
    int len = text.LastIndexOf(']') - start + 1;
    string sqbrackets = text.Substring(start, len);
    
[/code]

これで`sqbrackets`に`["aaa","bbb","ccc","ddd"]`が入ります。

`sqbrackets`を経由せずにカンマで区切られた文字列の配列にするには、以下のようにします。  
文字列配列の作成

[code]

    string csv = text.Substring(start + 1, len - 2);
    string[] csarray = csv.Split(',',StringSplitOptions.TrimEntries);
    
[/code]

これでcsarrayにダブルクォーテーションで囲んだ文字列が配列として格納されます。

`sqbrackets`から作る場合は上記の1行目を以下にします。

[code]

    string csv = sqbrackets.Substring(1, len - 2);
    
[/code]

以下のようにすれば配列をカンマで連結して1行で表示します。

[code]

    Console.WriteLine(string.Join(',',csarray));
    
[/code]

* * *

色々な場合分けや例外的な文字・文字列の扱いをどうするか、といったことも考えるなら、そうした条件を細かくサブルーチン化してチェックするなり、正規表現を使うとかすれば良いと思われます。  
正規表現ならこんな記事を参考に：  
[Regular Expression for double-quoted values in
CSV](https://stackoverflow.com/q/23527369/9014308)  
[Parse Microsoft-style CSV data with
regex](https://gist.github.com/awwsmm/886ac0ce0cef517ad7092915f708175f)


CC BY-SA 4.0
2022-05-08T07:00:34.467
88699
2022-05-08T07:15:24.600
2022-05-08T07:15:24.600
26370
26370
88697
answer


> できればJsonを使わずに作成したい

の意図は分かりませんが、[`JsonSerializer.Deserialize`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.text.json.jsonserializer.deserialize?view=net-6.0#system-
text-json-jsonserializer-deserialize\(system-string-system-type-system-text-
json-jsonserializeroptions\))を使えば

[code]

    var text = @"[""aaa"",""bbb"",""ccc"",""ddd""]";
    
    var arr = JsonSerializer.Deserialize<string[]>(text);
    
[/code]

で解析できます。`text`は`string`型であり、`arr`は`string[]`型となります。

* * *

kunifさんが末尾で提案されている正規表現、これを書いてみました。文字列には`[`や`"`が登場し、これを`string`や正規表現としてエスケープする必要があるためわかりづらいです。そこでまずは正規表現のパターンを挙げます。

[code]

    ^\["(?<item>[^"]*)"(?:,"(?<item>[^"]*)")*\]$
    
[/code]

これをソースコード上の文字列として記述するためにエスケープすると

[code]

    var match = Regex.Match(text, @"^\[""(?<item>[^""]*)""(?:,""(?<item>[^""]*)"")*\]$");
    var arr = match.Groups["item"].Captures.OfType<Capture>().Select(c => c.Value).ToArray();
    
[/code]

と表せます。  
正規表現では`()`などでマッチした範囲をキャプチャすることができます。また`*`や`+`などの量指定子で複数回マッチさせることができます。一般的な正規表現では複数回マッチした範囲の場合、最後のキャプチャが採用されますが、.NETの正規表現では複数回マッチした場合、`Captures`プロパティを通じてそれぞれのキャプチャ内容にアクセスすることができます。  
また一部の正規表では範囲に名前を付けることで名前付きキャプチャが提供されますが、.NETの正規表現では複数個所で同名の名前を付けた場合にキャプチャした内容を統合することができます。  
これらの機能を駆使することで`match.Groups["item"].Captures`には`""`に括られた内容を纏めることができます。


CC BY-SA 4.0
2022-05-08T07:04:59.527
88700
2022-05-13T23:18:41.860
2022-05-13T23:18:41.860
4236
4236
88697
answer


ファイルから読んできた文字列 text から、(1) Replace メソッドで [ ] " を削除して、Split メソッドで配列にする方法と、(2)
JSON のデシリアライザを使う方法の両方の例を載せておきます。

[![画像の説明をここに入力](https://i.stack.imgur.com/9ZDhp.jpg)](https://i.stack.imgur.com/9ZDhp.jpg)


CC BY-SA 4.0
2022-05-08T07:16:54.803
88701
2022-05-08T07:16:54.803
51338
88697
answer