我需要解析一个字符串并在每个Guid值周围添加单引号。我以为我可以使用正则表达式来做这件事,但我不是一个正则表达式的大师。
是否有一个好的正则表达式用于识别Guid?
我的第二个问题是,一旦我找到了一个有效的正则表达式,我假设我会使用Regex.Replace(String, String, MatchEvaluator)
,但我不太确定语法。也许是这样的:
return Regex.Replace(stringToFindMatch, GuidRegex, match =>
{
return string.Format("'{0}'", match.Groups[0].ToString());
});
我正在尝试解析的字符串可能如下所示:
“SELECT passwordco0_.PASSWORD_CONFIG_ID为PASSWORD1_46_0_, 从 密码_CONFIG密码co0_ 哪里 passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p0 = baf04077-a3c0-454b-ac6f-9fec00b8e170 [类型:指南(0)]“
答案 0 :(得分:168)
这个非常简单,并且不像你说的那样需要代表。
resultString = Regex.Replace(subjectString,
@"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$",
"'$0'");
这匹配以下样式,这些样式都是GUID的等效和可接受的格式。
ca761232ed4211cebacd00aa0057b223
CA761232-ED42-11CE-BACD-00AA0057B223
{CA761232-ED42-11CE-BACD-00AA0057B223}
(CA761232-ED42-11CE-BACD-00AA0057B223)
更新1
@NonStatic在评论中指出上述正则表达式将匹配具有错误结束分隔符的误报。
广泛支持的正则表达式条件可以避免这种情况。
JGsoft引擎,Perl,PCRE,Python和.NET框架支持条件。 Ruby从2.0版开始支持它们。 Delphi,PHP和R等语言 具有基于PCRE的正则表达式功能也支持条件。 (来源http://www.regular-expressions.info/conditional.html)
后面的正则表达式将匹配
{123}
(123)
123
并且不匹配
{123)
(123}
{123
(123
123}
123)
正则表达式:
^({)?(\()?\d+(?(1)})(?(2)\))$
简化了解决方案,仅匹配数字,以更清晰的方式显示需要的内容。
答案 1 :(得分:30)
最基本的正则表达式如下:
(^([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$)
或者你可以paste it here。
希望这可以节省你一些时间。
答案 2 :(得分:9)
您可以使用http://regexhero.net/tester/轻松自动生成C#代码。
免费。
我是这样做的:
然后该网站自动生成.NET代码:
string strRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @" {CD73FAD2-E226-4715-B6FA-14EDF0764162}.Debug|x64.ActiveCfg = Debug|x64";
string strReplace = @"""$0""";
return myRegex.Replace(strTargetString, strReplace);
答案 3 :(得分:5)
让C#.Net查找并替换给定文本中的任何guid外观字符串,
使用此RegEx:
[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?
示例C#代码:
var result = Regex.Replace(
source,
@"[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?",
@"${ __UUID}",
RegexOptions.IgnoreCase
);
肯定有效!它匹配&替换以下样式,这些样式都是GUID的等效和可接受的格式。
"aa761232bd4211cfaacd00aa0057b243"
"AA761232-BD42-11CF-AACD-00AA0057B243"
"{AA761232-BD42-11CF-AACD-00AA0057B243}"
"(AA761232-BD42-11CF-AACD-00AA0057B243)"
答案 4 :(得分:4)
在.NET Framework 4中有增强的System.Guid结构,其中包括用于解析GUID的新TryParse和TryParseExact方法。 这是一个例子。
//Generate New GUID
Guid objGuid = Guid.NewGuid();
//Take invalid guid format
string strGUID = "aaa-a-a-a-a";
Guid newGuid;
if (Guid.TryParse(objGuid.ToString(), out newGuid) == true)
{
Response.Write(string.Format("<br/>{0} is Valid GUID.", objGuid.ToString()));
}
else
{
Response.Write(string.Format("<br/>{0} is InValid GUID.", objGuid.ToString()));
}
Guid newTmpGuid;
if (Guid.TryParse(strGUID, out newTmpGuid) == true)
{
Response.Write(string.Format("<br/>{0} is Valid GUID.", strGUID));
}
else
{
Response.Write(string.Format("<br/>{0} is InValid GUID.", strGUID));
}
在这个例子中,我们创建了新的guid对象,并且还获取了一个具有无效guid的字符串变量。之后我们使用TryParse方法验证两个变量是否都有有效的guid格式。通过运行示例,您可以看到字符串变量没有有效的guid格式,并且它给出了“InValid guid”的消息。如果字符串变量具有有效的guid,那么它将在TryParse方法中返回true。
答案 5 :(得分:0)
我使用了更简单的正则表达式模式
^[0-9A-Fa-f\-]{36}$