【发布时间】:2017-05-30 22:49:21
【问题描述】:
我尝试使用 IndexOf 从行中检索 GUID 来简化一些遗留代码。我可以进一步简化下面的代码以摆脱使用 guids.Any 和 guids.First 吗?
// Code using regular expression
private static string RetrieveGUID2(string[] lines)
{
string guid = null;
foreach (var line in lines)
{
var guids = Regex.Matches(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?")
.Cast<Match>().Select(m => m.Value);
if (guids.Any())
{
guid = guids.First();
break;
}
}
return guid;
}
在编译示例中给出的遗留代码下方:
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApplication2
{
internal class Program
{
private static void Main(string[] args)
{
var lines = new[]
{
"</ItemGroup>\n",
"<PropertyGroup\n",
"Label = \"Globals\">\n",
"<ProjectGuid>{A68615F1-E672-4B3F-B5E3-607D9C18D1AB}</ProjectGuid>\n",
"</PropertyGroup>\n"
};
Console.WriteLine(RetrieveGUID(lines));
Console.WriteLine(RetrieveGUID2(lines));
}
// Legacy code
private static string RetrieveGUID(string[] lines)
{
string guid = null;
foreach (var line in lines)
{
var startIdx = line.IndexOf("<ProjectGuid>{", StringComparison.Ordinal);
if (startIdx < 0) continue;
var endIdx = line.IndexOf("</ProjectGuid>", StringComparison.Ordinal);
if (endIdx < 0) continue;
startIdx += "<ProjectGuid>".Length;
var guidLen = endIdx - startIdx;
guid = line.Substring(startIdx, guidLen);
break;
}
return guid;
}
// Code using regular expression
private static string RetrieveGUID2(string[] lines)
{
string guid = null;
foreach (var line in lines)
{
var guids = Regex.Matches(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?")
.Cast<Match>().Select(m => m.Value);
if (guids.Any())
{
guid = guids.First();
break;
}
}
return guid;
}
}
}
【问题讨论】:
-
你为什么不直接使用 guid.tryparse
-
Guid.TryParse()比尝试使用自己的正则表达式解析 GUID 好得多 -
是的,只需使用 xdoc 获取值并解析 guid
-
CTRL+A, CTRL+C, Edit\Paste Special\Paste XML as Classes, Deserialize Xml, 以文明的方式做你的事。或者,如果你不够文明,你也可以使用 XPath。
标签: c#