使用正则表达式替换字符串中的类属性

问题描述:

请将我想替换字符串中的类属性(或字段),我想使用正则表达式,但我不熟悉正则表达式。字符串的 例子:使用正则表达式替换字符串中的类属性

string Source = "Dear @Customer.Civility, @Customer.Name @Customer.Surname\n\n " + 
"About your bill dated @Order.Date..." 

我要赶类属性的出现次数,如“@ Customer.Name”,“@ Order.Date”,并使用反射其值进行替换。

有没有人来帮助我,请(原谅我的英语...)

+2

'string.Replace()'这里有什么问题? – Jonesopolis 2014-10-31 13:30:33

+0

您使用反射的对象是什么?你能粘贴它的代码/定义吗? – theMayer 2014-10-31 13:32:58

+1

另外,你到目前为止是否尝试过任何代码?我们也希望看到这一点。 – theMayer 2014-10-31 13:38:32

你真的想要去这么复杂呢?

为什么只是没有像

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) 
+2

-1:不回答问题。我认为他想为一般情况提供一些东西,而不必每次都重写代码。实际上,对我来说很有意义。 – theMayer 2014-10-31 13:34:12

+0

我现在不知道什么**类**是在源文本(当然可能有一个,两个或三个,如客户,Ordrer或paiements)和多少事件的类重复... **谢谢* * – relghers 2014-10-31 14:17:23

从正则表达式的原因可能不是正确的解决方案的意见

除此之外,如果你确实需要一个正则表达式(因为你需要这个更具动态性,例如可能处理几个模板),例如:

@\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 

所以,现在你已经确定的指标,你需要从你从该对象需要替代和属性的对象。

+0

非常感谢你,这就是我正在寻找的... – relghers 2014-10-31 13:54:11

+0

可能是在标识符'@(? [^ 0-9] \ w *)\。?(? [^ 0-9] \ w *)' – Tselofan 2017-10-18 13:52:40

这实际上是一个有趣的挑战。我用马特的正则表达式。

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

我没有添加任何异常处理,如果对象没有必需的属性会发生这种情况。

+0

来源中的所有类和属性都是已知的,我们可以很容易地测试它们的存在**感谢** – relghers 2014-10-31 14:27:19

+0

小修正,在'foreach'循环中它应该是'正则表达式。匹配(格式)'。否则,很好的答案。我也给团队起了个名字! – 2014-10-31 14:36:56