使用正则表达式替换字符串中的类属性
请将我想替换字符串中的类属性(或字段),我想使用正则表达式,但我不熟悉正则表达式。字符串的 例子:使用正则表达式替换字符串中的类属性
string Source = "Dear @Customer.Civility, @Customer.Name @Customer.Surname\n\n " +
"About your bill dated @Order.Date..."
我要赶类属性的出现次数,如“@ Customer.Name”,“@ Order.Date”,并使用反射其值进行替换。
有没有人来帮助我,请(原谅我的英语...)
你真的想要去这么复杂呢?
为什么只是没有像
string Source = "Dear {0}, {1} {2}\n\n " + "About your bill dated {3}..."
一个字符串,后来格式像
string result = string.Format(Source,
Customer.Civility,
Customer.Name,
Customer.Surname,
Order.Date)
除此之外,如果你确实需要一个正则表达式(因为你需要这个更具动态性,例如可能处理几个模板),例如:
@\w+\.?\w+
应该做的伎俩。
它匹配字面@
随后1个或多个单词字符(\w
是类[A-Za-z0-9_]
,即速记所有的字母,数字和下划线,这将覆盖你),然后是一个可选的.
(只是删除?
如果您希望它是非可选的),然后是一个或多个单词字符。
您可以使用它像这样:
var regex = new Regex(@"@\w+\.?\w+");
string Source = "Dear @Customer.Civility, @Customer.Name @Customer.Surname\n\n " +
"About your bill dated @Order.Date...";
foreach(Match m in regex.Matches(Source))
{
// do whatever processing you want with the matches here.
Console.WriteLine(string.Format("{0}:{1}",m.Index,m.Value));
}
日志:
5:@Customer.Civility
25:@Customer.Name
40:@Customer.Surname
82:@Order.Date
随着指数和本场比赛的文字,你应该有你需要让你的替代一切。
如果你想更容易从匹配中提取对象和属性,你可以在你的正则表达式中使用分组。事情是这样的:
var regex = new Regex(@"@(?<object>\w+)\.?(?<property>\w+)");
string Source = "Dear @Customer.Civility, @Customer.Name @Customer.Surname\n\n " +
"About your bill dated @Order.Date...";
foreach(Match m in regex.Matches(Source))
{
Console.WriteLine(string.Format("Index: {0}, Object: {1}, Property: {2}",
m.Index,m.Groups["object"],m.Groups["property"]));
}
将记录:
Index: 5, Object: Customer, Property: Civility
Index: 25, Object: Customer, Property: Name
Index: 40, Object: Customer, Property: Surname
Index: 82, Object: Order, Property: Date
所以,现在你已经确定的指标,你需要从你从该对象需要替代和属性的对象。
非常感谢你,这就是我正在寻找的... – relghers 2014-10-31 13:54:11
可能是在标识符'@(?
这实际上是一个有趣的挑战。我用马特的正则表达式。
var customer = new Customer() { Civility = "Mr.", Name = "Max", Surname = "Mustermann" };
var order = new Order();
string Source = "Dear @Customer.Civility, @Customer.Name @Customer.Surname\n\n About your bill dated @Order.Date...";
string s = BringTheMash(Source, new { Customer = customer, Order = order });
Console.WriteLine(s);
private static string BringTheMash(string format, object p)
{
string result = format;
var regex = new Regex(@"@(?<object>\w+)\.?(?<property>\w+)");
foreach (Match m in regex.Matches(format))
{
var obj = m.Groups[1].ToString();
var prop = m.Groups[2].ToString();
var parameter = p.GetType().GetProperty(obj).GetValue(p);
var value = parameter.GetType().GetProperty(prop).GetValue(parameter);
result = result.Replace(m.Value, value.ToString());
}
return result;
}
我没有添加任何异常处理,如果对象没有必需的属性会发生这种情况。
来源中的所有类和属性都是已知的,我们可以很容易地测试它们的存在**感谢** – relghers 2014-10-31 14:27:19
小修正,在'foreach'循环中它应该是'正则表达式。匹配(格式)'。否则,很好的答案。我也给团队起了个名字! – 2014-10-31 14:36:56
'string.Replace()'这里有什么问题? – Jonesopolis 2014-10-31 13:30:33
您使用反射的对象是什么?你能粘贴它的代码/定义吗? – theMayer 2014-10-31 13:32:58
另外,你到目前为止是否尝试过任何代码?我们也希望看到这一点。 – theMayer 2014-10-31 13:38:32