【问题标题】:Find matching guid in string [duplicate]在字符串中查找匹配的 guid [重复]
【发布时间】:2012-11-02 06:31:31
【问题描述】:

我需要使用Regex在字符串中找到匹配的GUID

string findGuid="hi sdkfj 1481de3f-281e-9902-f98b-31e9e422431f sdfsf 1481de3f-281e-9902-f98b-31e9e422431f"
var guid = Regex.Match(m.HtmlBody.TextData, @"^(\{){0,1}[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}(\}){0,1}$").Value;

【问题讨论】:

  • 您的代码不起作用吗?问题出在哪里?
  • 我无法获得匹配的 guid
  • 我不同意这不是重复的
  • 这实际上不是 100% 重复,但是您当然可以使用标记为重复的问题的最佳答案并调整它以删除表示表达式必须匹配的 ^ 字符字符串的开头和 $ 字符,表示表达式必须从字符串的末尾开始匹配。然后,您可以在开头添加 (?i) 以表示不区分大小写,这样您就不需要使用 RegexOptions.IgnoreCase,然后您会得到: (?i)[{(]?[0-9A-F]{ 8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?

标签: c# regex


【解决方案1】:

如果您想使用 Regex 模式获取 GUID。然后,试试这个模式

(\{){0,1}[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}(\}){0,1}

示例

string findGuid = "hi sdkfj 1481de3f-281e-9902-f98b-31e9e422431f sdfsf 1481de3f-281e-9902-f98b-31e9e422431f"; //Initialize a new string value
MatchCollection guids = Regex.Matches(findGuid, @"(\{){0,1}[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}(\}){0,1}"); //Match all substrings in findGuid
for (int i = 0; i < guids.Count; i++)
{
    string Match = guids[i].Value; //Set Match to the value from the match
    MessageBox.Show(Match); //Show the value in a messagebox (Not required)
}

注意:我使用了您提供的相同模式,只是删除了^ 字符,该字符表示表达式必须从字符串的开头匹配。然后,删除了$ 字符,该字符表示表达式必须从字符串的末尾开始匹配。

更多关于正则表达式的信息可以在这里找到:
Regular Expressions - a Simple User Guide and Tutorial

谢谢,
希望对您有所帮助:)

【讨论】:

    【解决方案2】:

    看起来您使用了不正确的正则表达式。 如果你需要指导

    {8}-{4}-{4}-{4}-{12}

    应该是这样的

    [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}

    你可以这样试试:

    string findGuid="hi sdkfj 1481de3f-281e-9902-f98b-31e9e422431f sdfsf 1481de3f-281e-9902-f98b-31e9e422431f";
        string regexp = @"[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}";
        if (Regex.IsMatch(findGuid, regexp))
        {
            Console.WriteLine(
            Regex.Match(findGuid, regexp).Value
            );
    
        }
    

    【讨论】:

      【解决方案3】:

      您可以在拆分数组上使用Guid.TryParse。比如:

      string findGuid = "hi sdkfj 1481de3f-281e-9902-f98b-31e9e422431f sdfsf 1481de3f-281e-9902-f98b-31e9e422431f";
      string[] splitArray = findGuid.Split();
      List<Guid> listofGuid = new List<Guid>();
      foreach (string str in splitArray)
      {
          Guid temp;
          if (Guid.TryParse(str, out temp))
              listofGuid.Add(temp);
      }
      

      这将在 Guid 列表中为您提供两个项目

      编辑:对于根据 OP 评论的新字符串,

      string findGuid="hi sdkfj x-Guid:1481de3f-281e-9902-f98b-31e9e422431f sdfsf x-Guid:1481de3f-281e-9902-f98b-31e9e422431f"
      

      可以指定多个拆分分隔符,例如:

      string[] splitArray = findGuid.Split(' ', ':');
      

      【讨论】:

      • 不带参数的Split()对字符串有什么作用?
      • @nawfal,按空格分割,刚学会couple of days ago on SO
      • 如果字符串是这样的字符串 findGuid="hi sdkfj x-Guid:1481de3f-281e-9902-f98b-31e9e422431f sdfsf x-Guid:1481de3f-281e-9902-f98b-31e9e422431f"
      • @Habib 哇.. 很高兴知道。谢谢。
      • @user1551433,在这种特殊情况下,您必须拆分多个字符:string[] splitArray = findGuid.Split(' ', ':');
      【解决方案4】:
      模式 = "\b[\dA-F]{8}-[\dA-F]{4}-[\dA-F]{4}-[\dA-F]{4}-[\ dA-F]{12}-\d+"
      string input = "name=4a3779ab-56cc-41b5-ac7c-03bbf673439c-53607.jpg This is input string";
          Match m = Regex.Match(input, @"\b[\dA-F]{8}-[\dA-F]{4}-[\dA-F]{4}-[\dA-F]{4}-[\dA-F]{12}", RegexOptions.IgnoreCase);
          string output = null;
          if (m.Success)
              output = m.Value;
      

      【讨论】:

        【解决方案5】:

        在 .NET 4.0 及更高版本中,您可以使用 Guid.TryParse。这是我使用的扩展方法。

        public static bool IsGuid(this string checkGuid)
        {
            if (string.IsNullOrEmpty(checkGuid)) return false;
            Guid resultGuid;
            return Guid.TryParse(checkGuid, out resultGuid);
        }
        

        你可以这样称呼它。

        public MyMethod(string myToken)
        {
            if (myToken.IsGuid())
            {
                // Do something
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2022-11-30
          • 2017-04-08
          • 2020-09-04
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 2021-01-26
          • 1970-01-01
          相关资源
          最近更新 更多