在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);
最好的方法是使用正则表达式还是使用大量indexOf
和substring
来根据静态%%
字符进行提取?
答案 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个名为x
和csv
的命名组,因此您可以轻松地按名称引用它们并将其分配给值:
var x = match.Groups["x"];
var y = match.Groups["csv"];