C#Regex for Guid


121

我需要解析一个字符串,并在每个Guid值周围添加单引号。我当时以为可以使用Regex来做到这一点,但我并不是正则表达式专家。

是否有一个好的正则表达式可用于标识Guid?

我的第二个问题是,一旦我发现我想使用一个有效的正则表达式,就会Regex.Replace(String, String, MatchEvaluator)对语法有所不确定。也许像:

return Regex.Replace(stringToFindMatch, GuidRegex, match =>
{
    return string.Format("'{0}'", match.Groups[0].ToString());
});

我要解析的字符串可能看起来像这样:

“从PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p0 = baf04077-a3c0-454b-ac6f-9fec00 [[]]上,选择PASSWORDco0_.PASSWORD_CONFIG_ID作为PASSWORD1_46_0_,


5
那就是SQL,您应该使用SQL参数。
jrummell 2012年

2
您为什么要使用REgex,有一个GUID.IsGUid
Micah Armantrout

实际上,有一个参数,但它与where子句中的值相同。这是哪里来的?探查器?
jrummell 2012年

@jrummell这是来自分析器的。我正在尝试转换输出,以便可以复制并粘贴并在SQL Management Studio中运行它。这仅用于记录目的。它仍将作为参数化的sql运行。
Cole W

Answers:


182

这很简单,不需要您所说的委托。

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版本开始支持它们。具有基于PCRE的正则表达式功能的语言(如Delphi,PHP和R)也支持条件语句。(来源http://www.regular-expressions.info/conditional.html

后面的正则表达式将匹配

{123}
(123)
123

并且不匹配

{123)
(123}
{123
(123
123}
123)

正则表达式:

^({)?(\()?\d+(?(1)})(?(2)\))$

解决方案经过简化,仅匹配数字以更清晰地显示需要的内容。


如所写,这不适用于所有有效类型的GUID(因此需要更新)。
senfo 2015年

4
这不考虑小写字符,这是有效的大小写。使用^ [{|(]?[0-9a-fA-F] {8} [-]?([0-9a-fA-F] {4} [-]?){3} [0-9a- fA-F] {12} [)|}]] $或使用/ i标志
Michael Brown

@MichaelBrown确实不区分大小写,请参见代码示例中的RegexOptions.IgnoreCase。
棘手的

1
正则表达式还将允许少于4个减号。供那些关心此事的人使用。对于那些不在乎的人,这里有一个更简单的正则表达式,它允许更多的误报:[0-9a-fA-F\-]{32,36}
usr

1
不适用于https://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic

40

最基本的正则表达式如下:

(^([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})$) 

或者您可以将其粘贴在这里

希望这可以节省您一些时间。


与建议的答案不完全一样,但是regex101.com链接为+1。
吉姆·比利格

4
删除了重复项:[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}破折号可以设为可选:[0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}
路易·萨默斯

16

为了让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)" 

3
接受的答案对我不起作用,但是这个答案对我有用!
Merin Nakarmi

这里有一个问题。Guid仅包含十六进制数字。因此,来自az和AZ的字母是不可接受的,而只能是af和AF。否则,它将接受任何32个字符的文本作为有效的Guid。
Merin Nakarmi

8

.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。


7
问题是询问如何从更长的字符串中查找/提取GUID,而不验证GUID。建议您删除此答案。
Gone Coding

13
@Micah Armantrout:这可能是一个“不错”的答案,但不是这个问题的答案。如果您只是在自己喜欢的任何地方放一个答案,就可能违反StackOverflow的目的:)
Gone Coding

8
好吧,对于像我这样的人来说,寻找“ regex for guid”,这个答案确实是最有用的-我真的不需要正则表达式,我需要匹配GUID,并且此页面是“ regex检测到”的第一个结果guid”。
丹·菲尔德

3
借用@Dan Field。我是在这里搜索guid的正则表达式的,而这个答案正是我真正想要的。这样就实现了StackOverflow的目的。
JLScott

这不是相关的答案,但它当然是有帮助的。我一票。:)
Merin Nakarmi,

8

您可以使用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);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.