解析我的专有字符串格式

Mic*_*mol 4 c# string extract

我们如何从以下字符串中获取数字7和4和5:

MODULE potmtpMAIN main <info: "Enterprise Optimizer 7.4 for COR Technology 5.5 --    
Advanced Solver Edition", url:"http://EO.riverlogic.com", url_menu:"EO Online...",  
app_id:"EOAS",app_name:"Enterprise Optimizer AS", app_major:7,  
app_minor:4,app_micro:5,app_copyright:"\251 1996-2010 River Logic Inc.\r\nAll 
Rights Reserved."> 
Run Code Online (Sandbox Code Playgroud)

搜索必须基于app_major:app_minor:和app_micro

先感谢您

Kel*_*sey 5

我使用LINQ做到了......可能不是最好的方法,但想出来很有趣:

string test = "<info:\"Enterprise Optimizer 7.4 for COR Technology 5.5 -- Advanced Solver Edition\", url:\"http://EO.riverlogic.com\", url_menu:\"EO Online...\", app_id:\"EOAS\",app_name:\"Enterprise Optimizer AS\", **app_major:7**, **app_minor:4**,**app_micro:5**,app_copyright:\"251 1996-2010 River Logic Inc.\r\nAll Rights Reserved.\">";

var result = test.Split(',').
    Select(p => p.Trim().Split(':')).
    Where(i => i[0].Trim().StartsWith("**app_")).
    Select(r => new { Key = r[0].Trim('*'), Value = r[1].TrimEnd('*') });
Run Code Online (Sandbox Code Playgroud)

生产:

result = {{Key = "app_major", Value = "7"},
          {Key = "app_minor", Value = "4"}, 
          {Key = "app_micro", Value = "5"}}
Run Code Online (Sandbox Code Playgroud)

它甚至可能更优雅地完成:)

编辑:如果你想让访问你想做的事情变得非常简单:

var result = test.Split(',').
    Select(p => p.Trim().Split(':')).
    Where(i => i[0].Trim().StartsWith("**app_")).
    Select(r => new { Key = r[0].Trim('*'), Value = r[1].TrimEnd('*') }).
    ToDictionary(k => k.Key, v => v.Value);
Run Code Online (Sandbox Code Playgroud)

然后获取值,只需给它这样的键:

var version = result["app_major"] ?? "Not Found";
Run Code Online (Sandbox Code Playgroud)

注意:我已经测试了LINQ的解决方案VS正则表达式的解决方案和LINQ版本没有那么多在速度方面的差异,但是它比张贴的正则表达式的答案有点慢.正则表达式的答案虽然不能为您清理数据并以易于使用的方式呈现.该ToDictionary部分确实减慢了速度(虽然实际上几乎没有任何东西)但它确实使结果更容易使用.