0

C# では、この種の文字列を分割する最良の方法は何でしょうか?

%%x%%a,b,c,d

そのため、 %% と 2 番目の %% の右側のすべてを含む別の変数の間の値になります。var x = "x"; var y = "a,b,c,d"

a,b,c..カンマで区切られた無限のリストがどこにある可能性があります。リストと、2 つの 2 パーセント記号の間の値を抽出する必要があります。(無限の部分に対抗するために、おそらく文字列を :%%x%%とに分離することを考えましたa,b,c,d。この時点で、このようなものを使用して X を取得できます。

var tag = "%%";
      var startTag = tag;
      int startIndex = s.IndexOf(startTag) + startTag.Length;
      int endIndex = s.IndexOf(tag, startIndex);
      return s.Substring(startIndex, endIndex - startIndex);

最善の方法は、正規表現を使用するか、または多くを使用indexOfsubstringて、静的%%文字に基づいて抽出を行うことでしょうか?

4

5 に答える 5

2

必要なものが「x、a、b、c、d」であることを考えると、Split() 関数は実際には非常に強力であり、正規表現はこれにはやり過ぎです。

次に例を示します。

string test = "%%x%%a,b,c,d";
string[] result = test.Split(new char[] { '%', ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string s in result) {
  Console.WriteLine(s);
}

基本的に、'%' と ',' の両方で分割し、空の結果 (例: "%%" の間の結果) を無視するように要求します。結果は次のとおりです。

x
a
b
c
d
于 2013-02-20T16:10:32.083 に答える
1

これにより、すべてを一度に実行できます。

string pattern = "^%%(.+?)%%(?:(.+?)(?:,|$))*$";
string input = "%%x%%a,b,c,d";
Match match = Regex.Match(input, pattern);
if (match.Success)
{
    // "x"
    string first = match.Groups[1].Value;
    // { "a", "b", "c", "d" }
    string[] repeated = match.Groups[2].Captures.Cast<Capture>()
        .Select(c => c.Value).ToArray();
}
于 2013-02-20T16:16:26.730 に答える
1

抽出するにはX:

%%常に最初にある場合は、;

string s = "%%x%%a,b,c,d,h";
s = s.Substring(2,s.LastIndexOf("%%")-2);
//Console.WriteLine(s);

そうしないと;

string s = "v,u,m,n,%%x%%a,b,c,d,h";
s = s.Substring(s.IndexOf("%%")+2,s.LastIndexOf("%%")-s.IndexOf("%%")-2);
//Console.WriteLine(s);

一度にすべて取得する必要がある場合は、これを使用してください。

string s = "m,n,%%x%%a,b,c,d";

var myList = s.ToArray()
              .Where(c=> (c != '%' && c!=','))
              .Select(c=>c).ToList();
于 2013-02-20T16:11:35.683 に答える
0

と後のすべての間の値が%%別の変数で必要であり、CSV を解析する必要がないため、RegEx ソリューションが最良の選択になると思います。

var inputString = @"%%x%%a,b,c,d";
var regExPattern = @"^%%(?<x>.+)%%(?<csv>.+)$";

var match = Regex.Match(inputString, regExPattern);

foreach (var item in match.Groups)
{
    Console.WriteLine(item);                
}

パターンには と という 2 つの名前付きグループがxあるcsvため、単にループするのではなく、名前で簡単に参照して値に割り当てることができます。

var x = match.Groups["x"];
var y = match.Groups["csv"];
于 2013-02-20T16:13:50.433 に答える
0

を使用しchar.IsLetterて、すべてのlist of letter

string test = "%%x%%a,b,c,d";
var l = test.Where(c => char.IsLetter(c)).ToArray();
var output = string.Join(", ", l.OrderBy(c => c));
于 2013-02-20T16:06:58.143 に答える