所以我之前问过这个问题,并说我想要在 javascript 中使用它,但后来意识到它发送了不必要的数据。因此,如果有人可以帮助我在 C# 中解决同样的问题,那就太好了
我需要的是从字符串中获取几个属性。
该字符串将类似于:
str = "car[brand=saab][wheels=4]";
可以有更多或更少的属性。
我需要 1 个变量中第一个 [] 之前的所有内容。
然后我需要变量中的每个属性及其值。
了解我想要什么的最简单方法可能是检查我以前的问题和解决它的答案:)
试试这个正则表达式:
(.+?)(\[.+?\])+
和示例代码:
var inputString = "car[brand=saab][wheels=4]";
var pattern = @"(?<v1>.+?)(?<v2>\[.+?\])+";
var v1 = Regex.Match(inputString, pattern).Groups["v1"].Value;
Dictionary<String, String> list = new Dictionary<String, String>();
foreach (Capture capture in Regex.Match(inputString, pattern).Groups["v2"].Captures)
{
var sp = capture.Value.Split('=');
list.Add(sp[0], sp[1]);
}
解释:
(?<name>subexpression)
将匹配的子表达式捕获到命名组中。
我在您之前的问题中使用了正则表达式(略有不同)。
string input = "car[brand=saab][wheels=4]";
string product = "";
Dictionary<string, string> props = new Dictionary<string, string>();
foreach (Match m in Regex.Matches(input, @"^(\w+)|\[(\w+)=(.+?)\]"))
{
if (String.IsNullOrEmpty(product))
product = m.Groups[1].Value;
else
props.Add(m.Groups[2].Value, m.Groups[3].Value);
}
你可以这样做
var lst=Regex.Matches(input,@"(\w+)((?:\[.*?\])+)")
.Cast<Match>()
.Select(x=>new
{
name=x.Groups[1].Value,
value=Regex.Matches(x.Groups[2].Value,@"(?<=\[).*?(?=\])")
.Cast<Match>()
.Select(x=>new
{
name=x.Groups[0].Value.Split('=')[0],
value=x.Groups[0].Value.Split('=')[1]
})
});
现在你可以像这样迭代 lst
foreach(var parent in lst)
{
parent.name;//car
foreach(var pairs in parent.value)
{
pairs.name;//brand,wheels
pairs.value;//ferrari,4
}
}
所以,对于输入car[brand=a][wheels=4]cycle[brand=b][wheels=2]
输出就像
car
brand,a
wheels,4
cycle
brand,b
wheels,2
由于您已经使用正则表达式得到了答案,并且您的评论指出它不必使用正则表达式,我将提供一个替代方案:
代码是
string str = ("car[brand=saab][wheels=4]");
int i = str.IndexOf("[");
string[] details =str.Substring(i).Replace("]","").Split('[');
string name = str.Substring(0, i);
string brand = details[1].Split('=')[1];
string wheels = details[2].Split('=')[1];
这种方法假设数据总是采用相同的格式;根据您的需要,您可能需要在那里进行一些验证...
没有正则表达式:
string input = "car[brand=saab][wheels=4]";
var query = from s in input.Replace("]", "").Split('[')
let vars = s.Split('=')
let name = vars[0]
let value = vars.Length > 1 ? vars[1] : ""
select new {Name = name, Value = value};
string firstVar = query.First().Name;
Dictionary<string, string> otherVars = query
.Skip(1)
.ToDictionary(v => v.Name, v => v.Value);
您可以像这样访问字典中的变量string brand = otherVars["brand"]