我有一个像(Name := Sam&&Age=:17&& Score:=C6)
的字符串和一个名为Person的类,有大约30个属性 - 名称,年龄,分数等。如果有可变数量的属性,我如何编写正则表达式来解析字符串? ?
此外,我正在考虑进行一些字符串替换,将字符串转换为正确的JSON,然后解析它。对于生产代码来说这听起来不错吗?
我正在使用C#2010。
答案 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);
}