解析我的专有字符串格式

时间:2010-05-27 20:07:50

标签: 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."> 

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

提前谢谢

5 个答案:

答案 0 :(得分: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('*') });

产地:

result = {{Key = "app_major", Value = "7"},
          {Key = "app_minor", Value = "4"}, 
          {Key = "app_micro", Value = "5"}}

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

编辑:如果您想让访问您想要的内容变得非常简单:

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

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

var version = result["app_major"] ?? "Not Found";

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

答案 1 :(得分:3)

只做一个正则表达式,像app_m....:\d这样的东西可能有用,但我不确定(我通常使用RegexBuilder之类的工具来制作它们)。

Regex.Match的文档有一个示例,向您展示如何编写实际代码以使用正则表达式:

http://msdn.microsoft.com/en-us/library/twcw2f1c.aspx

编辑:这样的事情可能有用:

Match m = Regex.Match(mystring, "app_major:\d{1-2}");
if(m.Success)
{
     string appMajor = m.Value.SubString(m.Value.IndexOf(":"));
}

如果我没记错的话,\d{1-2}位应该意味着您要获得一位或两位数字。

答案 2 :(得分:3)

使用正则表达式(?<=:)\d(?=\*\*)

已修改:问题已编辑,答案也是如此。 (?<=(app_major|app_minor|app_micro):)\d*

答案 3 :(得分:2)

使用正则表达式:

string regex = @"app_major:(?<major>\d+).*app_minor:(?<minor>\d+).*app_micro:(?<micro>\d+";
   RegexOptions options =        
      (RegexOptions.IgnorePatternWhitespace | 
      RegexOptions.Singleline | 
      RegexOptions.Multiline  | 
      RegexOptions.IgnoreCase);

Regex reg = new Regex(regex, options);

Match match = reg.Matches(yourString);

string major = match.Groups[1].Value
string minor = match.Groups[2].Value
string micro = match.Groups[3].Value

答案 4 :(得分:2)

这是一个简单的正则表达式,用于挑选每个部分,以及不熟悉.NET中正则表达式的人的示例代码:(编辑,因为编辑原始问题以删除星号)。

Regex Exp = new Regex(@"(?<=\W)app_major:(?'Number'\d+)");

Match M = Exp.Match(input);

if(M.Success)
{
    string Number = M.Groups["Number"].Value;
}

你可以使用3个不同的表达式,每个表达式用于从字符串中挑选出来的每个部分。

说明:

  • 第一部分(?<=\W)确保匹配前面有非单词字符(在这种情况下,很可能是逗号)。
  • 第二部分app_major:匹配您正在寻找的字符串的文字部分。
  • (?'Number'\d+)是一个已捕获的群组,我们将其标记为Number,我们正在尝试匹配一个或多个数字\d+