我有一个像这样的完整字符串
N:Pay in Cash++RGI:40++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:~~ N:ERedemption++RGI:42++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:
这个字符串是这样的
我需要提取Key“RGI”和“N”的值。
我可以通过for循环来做,我想要一种有效的方法来做到这一点。 对此有任何帮助。
编辑:从~~到~~
答案 0 :(得分:3)
不知道它是否比RegEx更有效,但是这里有一个使用LINQ to Objects的替代方案。
KeyValuePair<string, string>[] ns = (from po in pos.Split(new string[] { "~~" }, StringSplitOptions.RemoveEmptyEntries)
from op in po.Split(new string[] { "++" }, StringSplitOptions.RemoveEmptyEntries)
where op.StartsWith("N:") || op.StartsWith("RGI:")
let op_split = op.Split(':')
select new KeyValuePair<string, string>(op_split[0], op_split[1])).ToArray();
答案 1 :(得分:2)
我认为你应该尝试正则表达式。由于您使用的是C#,请查看this handy .NET RegEx cheat sheet。
答案 2 :(得分:2)
您可以将字符串解析为字典,然后输入您的值......
string s = "N:Pay in Cash++RGI:40++R:200++";
// Replace "++" with ","
s.Replace("++",",");
// Divide all pairs (remove empty strings)
string[] tokens = s.Split(new char[] { ':', ',' }, StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, string> d = new Dictionary<string, string>();
for (int i = 0; i < tokens.Length; i += 2)
{
string key = tokens[i];
string value = tokens[i + 1];
d.Add(key,value);
}
答案 3 :(得分:1)
听到你去了我使用正则表达式和合理数量的文本,他们预先形成。
static void Main(string[] args)
{
string str = @"N:Pay in Cash++RGI:40++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:~ ~N:ERedemption++RGI:42++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:";
System.Text.RegularExpressions.MatchCollection MC = System.Text.RegularExpressions.Regex.Matches(str,@"((RGI|N):.*?)\+\+");
foreach( Match Foundmatch in MC)
{
string[] s = Foundmatch.Groups[1].Value.Split(':');
Console.WriteLine("Key {0} Value {1} " ,s[0],s[1]);
}
}
答案 4 :(得分:1)
以下是基于索引进行搜索的尝试:(我更喜欢我添加的LINQ解决方案)
string test = "N:Pay in Cash++RGI:40++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:~ ~N:ERedemption++RGI:42++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:";
string[] parts = test.Split(new string[] { "~ ~" }, StringSplitOptions.None);
var result = parts.Select(p => new
{
N = p.Substring(p.IndexOf("N:") + 2,
p.IndexOf("++") - (p.IndexOf("N:") + 2)),
RGI = p.Substring(p.IndexOf("RGI:") + 4,
p.IndexOf("++", p.IndexOf("RGI:")) - (p.IndexOf("RGI:") + 4))
});
创建具有以下值的两个对象的列表:
result = {{N = "Pay in Cash", RDI = 40}, {N = "ERedemption", RDI = 42}}
编辑:使用LINQ解决方案
我决定尝试用LINQ做这一切,这就是我想出来的:
string test = "N:Pay in Cash++RGI:40++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:~ ~N:ERedemption++RGI:42++R:200++T:Purchase++IP:N++IS:N++PD:PC++UCP:598.80++UPP:0.00++TCP:598.80++TPP:0.00++QE:1++QS:1++CPC:USD++PPC:Points++D:Y++E:Y++IFE:Y++AD:Y++IR:++MV:++CP:";
var result = test.Split(new string[] { "~ ~" }, StringSplitOptions.None).
Select(m => m.Split(new string[] { "++" }, StringSplitOptions.None)).
Select(p => p.Select(i => i.Split(':')).
Where(o => o[0].Equals("N") || o[0].Equals("RGI")).
Select(r => new { Key = r[0], Value = r[1]}));
它为包含仅N和RGI的键值对的每个项生成和数组。
result = {{{Key = "N", Value = "Pay in Cash"}, {Key = "RDI", Value = 40}},
{{Key = "N", Value = "ERedemption"}, {Key = "RDI", Value = 42}}}
如果您愿意,可以删除Where
,它将包含所有键及其值。
答案 5 :(得分:0)
在“:”上使用string.Split()
来提取键值对。
然后根据需要提取。如果字符串中的位置未修复,则需要在生成的string[]
数组中搜索特定键的每个项目。
如果你需要经常搜索,我会考虑拆分键值对并放入某种词典。