C# 提取字符串c的部分#

C# 提取字符串c的部分#,c#,C#,在C#中,拆分此类字符串的最佳方法是什么 %%x%%a、b、c、d 因此,我最终得到%%和另一个变量之间的值,该变量包含第二个%%右边的所有内容 i、 e.var x=“x”;var y=“a、b、c、d” 其中,a,b,c..可以是一个以逗号分隔的无限列表。我需要提取列表和两个双百分比符号之间的值。 (为了对抗无限部分,我想也许可以将字符串分离为:%%x%%和a、b、c、d。此时,我可以使用类似的方法得到x var tag = "%%"; var startTag = tag;

在C#中,拆分此类字符串的最佳方法是什么

%%x%%a、b、c、d

因此,我最终得到%%和另一个变量之间的值,该变量包含第二个%%右边的所有内容 i、 e.
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);

最好的方法是使用正则表达式还是使用大量的
索引和
子字符串来基于静态
%%
字符进行提取?

您可以使用
char.isleter
来获取所有
字母列表

string test = "%%x%%a,b,c,d";
var l = test.Where(c => char.IsLetter(c)).ToArray();
var output = string.Join(", ", l.OrderBy(c => c));

您可以使用
char.isleter
获取所有
字母列表

string test = "%%x%%a,b,c,d";
var l = test.Where(c => char.IsLetter(c)).ToArray();
var output = string.Join(", ", l.OrderBy(c => c));

如果您想要的是“x,a,b,c,d”,那么Split()函数实际上非常强大,而regex在这方面做得太过分了

下面是一个例子:

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

如果您想要的是“x,a,b,c,d”,那么Split()函数实际上非常强大,而regex在这方面做得太过分了

下面是一个例子:

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

要提取
X

如果
%%
始终位于起始位置,则

string s = "%%x%%a,b,c,d,h";
s = s.Substring(2,s.LastIndexOf("%%")-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();

要提取
X

如果
%%
始终位于起始位置,则

string s = "%%x%%a,b,c,d,h";
s = s.Substring(2,s.LastIndexOf("%%")-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();

由于您希望将
%%
和后面的所有变量之间的值放在单独的变量中,并且不需要解析CSV,因此我认为正则表达式解决方案将是您的最佳选择

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);                
}

由于您希望将
%%
和后面的所有变量之间的值放在单独的变量中,并且不需要解析CSV,因此我认为正则表达式解决方案将是您的最佳选择

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);                
}

这将让您一次完成所有任务:

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();
}
string pattern=“^%%(.+?)%%(?:(.+?)(?:,|$)*$”;
字符串输入=“%%x%%a,b,c,d”;
Match=Regex.Match(输入,模式);
如果(匹配成功)
{
//“x”
string first=match.Groups[1]。值;
//{“a”、“b”、“c”、“d”}
string[]repeated=match.Groups[2]。Captures.Cast()
.Select(c=>c.Value).ToArray();
}

这将让您一次完成所有任务:

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();
}
string pattern=“^%%(.+?)%%(?:(.+?)(?:,|$)*$”;
字符串输入=“%%x%%a,b,c,d”;
Match=Regex.Match(输入,模式);
如果(匹配成功)
{
//“x”
string first=match.Groups[1]。值;
//{“a”、“b”、“c”、“d”}
string[]repeated=match.Groups[2]。Captures.Cast()
.Select(c=>c.Value).ToArray();
}

您不能使用
拆分(','))
为此?我不确定我是否遵循……您是否要这里的两个输出,
x
a,b,c,
,或者您是否也要分割删除的值,所以您想要
x
a
b
c
,等等,将第一位计算出来以显示我正在寻找的输出类型。我可以轻松地在%%之间获取内容,看起来很乱。你不能使用
Split(',')吗
为此?我不确定我是否遵循……您是否要这里的两个输出,
x
a,b,c,
,或者您是否也要分割删除的值,所以您想要
x
a
b
c
,等等,将第一位计算出来以显示我正在寻找的输出类型。我可以轻松地在%%之间获取内容,看起来很混乱。我真的很喜欢这种方法,我在regex还是相当糟糕,看到这样的帮助很大。虽然这不是我最后选择的方法,但如果输入变得更复杂,我可能不得不使用这种解决方案。我真的很喜欢这种方法,我在regex还是相当糟糕,看到这样的帮助很大。即使不是虽然这不是我最后采用的方法,但如果输入变得更复杂,我可能不得不使用此解决方案。