用于 Guid 的 C# 正则表达式

Posted

技术标签:

【中文标题】用于 Guid 的 C# 正则表达式【英文标题】:C# Regex for Guid 【发布时间】:2012-06-17 22:26:54 【问题描述】:

我需要解析一个字符串并在每个 Guid 值周围添加单引号。我在想我可以使用正则表达式来做到这一点,但我不完全是正则表达式大师。

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

我的第二个问题是一旦我找到了一个有效的正则表达式,我假设我会使用Regex.Replace(String, String, MatchEvaluator),但我不太确定语法。可能是这样的:

return Regex.Replace(stringToFindMatch, GuidRegex, match =>

    return string.Format("'0'", match.Groups[0].ToString());
);

我尝试解析的字符串可能如下所示:

“选择 密码co0_.PASSWORD_CONFIG_ID 为 PASSWORD1_46_0_, 从 PASSWORD_CONFIG 密码co0_ 在哪里 密码co0_.PASSWORD_CONFIG_ID=baf04077-a3c0-454b-ac6f-9fec00b8e170; @p0 = baf04077-a3c0-454b-ac6f-9fec00b8e170 [类型:Guid (0)]"

【问题讨论】:

那是SQL,你应该使用SQL参数。 为什么要使用正则表达式有一个 GUID.IsGUId 其实有一个参数,但是和where子句中的值一样。这是从哪里来的?剖析器? @jrummell 这是来自分析器是的。我正在尝试转换输出,以便我可以复制和粘贴它并在 SQL Management Studio 中运行它。这仅用于记录目的。它仍将作为参数化 sql 运行。 猜错我出msdn.microsoft.com/en-us/library/… 【参考方案1】:

这个很简单,不需要你说的委托。

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 在 cmets 中指出,上述正则表达式将匹配具有错误结束分隔符的误报。

这可以通过得到广泛支持的正则表达式条件来避免。

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)\))$

解决方案被简化为仅匹配数字,以便在需要时以更清晰的方式显示所需内容。

【讨论】:

正如所写,这不适用于所有有效类型的 GUID(因此进行了更新)。 这不考虑有效大小写的小写字符。使用 ^[|(]?[0-9a-fA-F]8[-]?([0-9a-fA-F]4[-]?)3[0-9a- fA-F]12[)|]?$ 或使用 /i 标志 @MichaelBrown 它不区分大小写,请参阅代码示例中的 RegexOptions.IgnoreCase。 正则表达式也将允许少于 4 个减号。供那些关心这个的人参考。对于那些不在乎的人,这里有一个更简单的正则表达式,它允许更多的误报:[0-9a-fA-F\-]32,36. 不适用于https://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a【参考方案2】:

大多数基本的正则表达式如下:

(^([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。

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

【讨论】:

不如建议的答案那么完整,但为 regex101.com 链接 +1。 删除了重复:[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【参考方案3】:

让 C# .Net 从给定文本中查找和替换任何具有 guid 外观的字符串,

使用这个正则表达式:

[(]?[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)" 

【讨论】:

接受的答案对我不起作用,但这个对我有用! 这里有一个问题。 Guid 将仅包含十六进制数字。因此,来自 a-z 和 A-Z 的字母是不可接受的,而只能是 a-f 和 A​​-F。否则它将接受任何 32 个字符的文本作为有效的 Guid。 同上 - 接受的答案对我不起作用,但这个对我有用! 你设置 RegexOptions.IgnoreCase - 因为这个 [a-f0-9] 就足够了。 是的,同意,忽略删除它,因为它没有伤害。 IgnoreCase 被放入初始答案,然后如果我没记错的话,我在正则表达式中添加了 [a-f0-9]。【参考方案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。

【讨论】:

问题是询问如何从较长的字符串中查找/提取 GUID,而不是验证 GUID。建议您删除此答案。 @Micah Armantrout:这可能是一个“好”的答案,但它不是this question的答案。如果您只是将任何答案放在您喜欢的任何地方,这有点违背 *** 的目的:) 好吧,对于像我这样正在寻找“guid 正则表达式”的人来说,这个答案确实是最有帮助的 - 我真的不需要正则表达式,我需要匹配 GUID,此页面是当前 Google 上“regex to detect guid”的第一个结果。 第二个@Dan Field。我来这里是为了寻找 guid 的正则表达式,发现这个答案是我真正想要的。 *** 的目的就这样实现了。 这不是相关的答案,但它当然是有帮助的。我一票。 :)【参考方案5】:

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

【讨论】:

【参考方案6】:

我使用更简单的正则表达式模式

^[0-9A-Fa-f\-]36$

【讨论】:

这将匹配多个 GUID ... 它只会匹配仅包含 Guid 而没有其他内容的行。

以上是关于用于 Guid 的 C# 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于查找 C# 类和方法名称的正则表达式

使用正则表达式仅提取两个特定标记之间的数字

用于在 C# 中获取字符串中的数值的正则表达式

用于自定义电子邮件和域的 C# 正则表达式

用于匹配嵌套括号内的特定文本的 C# 正则表达式

用于否定字符类的 C# 正则表达式,除非字符彼此相邻