c# - regex查找=之后的字符串

时间:2013-05-28 09:13:26

标签: c# regex

所以我之前问过这个问题并说我想在javascript中使用它,但后来意识到这是不必要的数据发送。所以,如果有人能帮助我在C#中解决同样的问题,那将会很棒。

我需要的是从字符串中获取几个属性。

字符串看起来像:

str = "car[brand=saab][wheels=4]";

可以有更多或更少的属性。

我需要在1变量中的第一个[]之前的所有内容。

然后我需要每个属性及其在变量中的值。

了解我想要的最简单的方法可能是检查我的previous question以及解决它的答案:)

5 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

(.+?)(\[.+?\])+

和示例代码:

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) 的   将匹配的子表达式捕获到命名组中。

答案 1 :(得分:2)

我在previous question中使用了正则表达式(略有不同)。

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

答案 2 :(得分:1)

你可以这样做

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

答案 3 :(得分:0)

由于您已经使用正则表达式获得了答案,并且您的评论声明它不一定是正则表达式,我将提供替代方案:

代码是

        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];

这种方法假设数据总是采用相同的格式;根据您的需要,您可能需要进行一些验证......

答案 4 :(得分:0)

没有正则表达式:

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"]