正则表达式解析项目列表

时间:2011-11-12 00:33:48

标签: c# regex

我有一个像(Name := Sam&&Age=:17&& Score:=C6)的字符串和一个名为Person的类,有大约30个属性 - 名称,年龄,分数等。如果有可变数量的属性,我如何编写正则表达式来解析字符串? ?

此外,我正在考虑进行一些字符串替换,将字符串转换为正确的JSON,然后解析它。对于生产代码来说这听起来不错吗?

我正在使用C#2010。

3 个答案:

答案 0 :(得分:1)

你绝对应该采用JSON方法。它比依赖正则表达式更清晰,更健壮。

看看这个: Parse JSON in C#

答案 1 :(得分:1)

如果您的分隔符为&&,则在使用正则表达式String.Split( "&&", myTextString)隔离键/值对时,我会(\w+)\s*:=\s*(\w+)

答案 2 :(得分:1)

此正则表达式应与您的输入字符串匹配。

\(\s*((?<PropertyName>.*?)\s*((:=)|(=:))\s*(?<PropertyValue>.*?)\s*(&&)?\s*)*\)

这就是它的含义:

\(                          Open paren
\s*                         Optional whitespace
(
    (?<PropertyName>.*?)    Property name group
    \s*                     Optional whitespace
    ((:=)|(=:))             Literal ':=' or '=:'
    \s*                     Optional whitespace
    (?<PropertyValue>.*?)   Property value group
    \s*                     Optional whitespace
    (&&)?                   Optional '&&' (the last one won't have one)
    \s*                     Optional whitespace
)*                          The proceeding can repeat 0-many times
\)                          Close paren

有了这个,你可以在C#中对你的字符串进行匹配:

var regex = new Regex(
    @"\(\s*((?<PropertyName>.*?)\s*((:=)|(=:))\s*(?<PropertyValue>.*?)\s*(&&)?\s*)*\)");
var match = regex.Match(yourString);

然后遍历每个属性/值对,设置对象的属性。设置对象属性需要一些反射和基于对象属性类型的不同代码:

var properyNames = match.Groups["PropertyName"].Captures;
var properyValues = match.Groups["PropertyValue"].Captures;
var numPairs = propertyNames.Count;

var objType = yourObj.GetType();
for (var i = 0; i < numPairs; i++)
{
    var propertyName = propertyNames[i].Value;
    var theValue = propertyValues[i].Value;

    var property = objType.GetProperty(propertyName);
    object convertedValue = theValue;
    if (property.PropertyType == typeof(int))
        convertedValue = int.Parse(theValue);
    if (property.PropertyType == typeof(DateTime))
        // ....
    // etc....

    property.SetValue(yourObj, convertedValue, null);
}