提取字符串的部分c#

时间:2013-02-20 16:00:51

标签: c#

在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来根据静态%%字符进行提取?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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();

答案 2 :(得分: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();
}

答案 3 :(得分: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));

答案 4 :(得分: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个名为xcsv的命名组,因此您可以轻松地按名称引用它们并将其分配给值:

var x = match.Groups["x"];
var y = match.Groups["csv"];