0

在 C# 中,拆分这种字符串的最佳方法是什么?

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

所以我最终得到 %% 和另一个变量之间的值,其中包含第二个 %% 的所有内容,即var x = "x"; var y = "a,b,c,d"

哪里a,b,c..可能是一个无限的逗号分隔列表。我需要提取两个双百分号之间的列表和值。(为了对抗无限部分,我想也许将字符串分离为:%%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

提取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 回答
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 回答
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 回答
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);                
}

该模式有两个名为xand的命名组csv,因此您可以轻松地按名称引用它们并将它们分配给值,而不仅仅是循环:

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