С# Regex for Guid

Мне нужно проанализировать строку и добавить одинарные кавычки вокруг каждого значения Guid. Я думал, что могу использовать Regex для этого, но я не совсем гуру-регге.

Есть ли подходящее Regex для определения 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_,                                     ИЗ                                         PASSWORD_CONFIG passwordco0_                                     ГДЕ                                         passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170;                                     @p0 = baf04077-a3c0-454b-ac6f-9fec00b8e170 [Тип: Guid (0)]"

Ответ 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 указывает в комментариях, что приведенное выше регулярное выражение будет соответствовать ложным срабатываниям, которые имеют неправильный закрывающий разделитель.

Этого можно избежать с помощью условных выражений регулярных выражений, которые широко поддерживаются.

Условные выражения поддерживаются движком 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)

Regex:

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

Решения упрощены, чтобы соответствовать только числам, чтобы показать более ясным способом, что требуется при необходимости.

Ответ 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})$) 

или вы можете вставить его здесь.

Надеюсь, это сэкономит вам некоторое время.

Ответ 3

Вы можете легко сгенерировать код С#, используя: http://regexhero.net/tester/.

Это бесплатно.

Вот как я это сделал:

enter image description here

Затем веб-сайт автоматически создает код .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);

Ответ 4

Для С#.Net, чтобы найти и заменить любую выглядящую guid строку из данного текста,

Используйте этот RegEx:

[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?

Пример кода С#:

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)" 

Ответ 5

В .NET Framework 4 есть улучшенная структура System.Guid, которая включает в себя новые методы TryParse и TryParseExact для анализа GUID. Вот пример для этого.

    //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, а также берем одну строковую переменную с недопустимым указателем. После этого мы используем метод TryParse для проверки того, что обе переменные имеют действующий формат guid или нет. При запуске примера вы можете видеть, что строковая переменная имеет неверный формат guid, и она дает сообщение "InValid guid". Если строковая переменная имеет действительный guid, то это вернет true в методе TryParse.

Ответ 6

Я использую более простой шаблон регулярных выражений

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