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

C# c-regex查找后面的字符串=,c#,regex,C#,Regex,所以我以前问过这个问题,说我想用javascript编写,但后来意识到发送的是不必要的数据。如果有人能帮我用C语言解决同样的问题,那就太好了 我需要的是从一个字符串中得到几个属性 字符串将类似于: str = "car[brand=saab][wheels=4]"; 可以有更多或更少的属性 我需要1个变量中第一个[]之前的所有内容 然后我需要一个变量中的每个属性及其值 了解我想要什么的最简单方法可能是检查我的和解决它的答案:试试这个正则表达式: (.+?)(\[.+?\])+ 和一个示例代码

所以我以前问过这个问题,说我想用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]);
}
说明:

?子表达式 将匹配的子表达式捕获到命名组中


由于您已经有了一个使用正则表达式的答案,并且您的评论指出它不必使用正则表达式,因此我将提供一个替代方案:

代码是

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

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

我在您的应用程序中使用的正则表达式略有不同

你可以这样做

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]
                            })
             });
因此,对于输入车[brand=a][wheels=4]循环[brand=b][wheels=2]

输出将是

car
   brand,a
   wheels,4
cycle
   brand,b
   wheels,2
没有正则表达式:

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

您可以访问字典中的变量,如以下字符串brand=otherVars[brand]

如果您对在字符串中查找模式有很多疑问,也许你应该自己看一本关于正则表达式的书。这一定要用正则表达式来完成吗?@Janesabouchleich我正在努力学习正则表达式,但我的日程安排很紧。我是一个新手程序员,所以我必须边打字边学习。这就是为什么我问问题而不是看书,其次,阅读有关编程的书籍对我来说并不实用:@DaveRook不,它不必是正则表达式,我只是认为这是一种更简单的方法。@Janesabouchleich是的,我知道正则表达式在那一个中工作得很好,但我并不真正理解函数的作用,因此我不能用c编写它。这实际上与那不太一样作者问v2是否也包含方括号作为捕获组的一部分?这是错误的。纠正所有错误后,输出仍然不正确。Ideone:仍然不正确,但几乎不正确,我得到了例外。可能是mono-2.8问题,但我在LinqPad=PS中得到了相同的错误:我不是TS,我知道解决方案,我只想给出这个答案,使其正确,并给你一个upvoteyes,现在我明白了。谢谢你的回答。然而,除了我的答案,这是所有答案中唯一正确的一个。^ ^ ^这恰好修复了我需要更改的内容,因此该产品也被添加到了词典中。谢谢!
car
   brand,a
   wheels,4
cycle
   brand,b
   wheels,2
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);