我们如何从以下字符串中获取数字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
提前谢谢
答案 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+
。