C # Regex для Guid


122

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

Есть ли хорошее регулярное выражение для идентификации Guid?

Мой второй вопрос: как только я нашел допустимое регулярное выражение, я предполагаю, что буду использовать, Regex.Replace(String, String, MatchEvaluator)но я не совсем уверен в синтаксисе. Может что-то вроде:

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

Строка, которую я пытаюсь разобрать, может выглядеть так:

"ВЫБЕРИТЕ passwordco0_.PASSWORD_CONFIG_ID как PASSWORD1_46_0_, FROM PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b0e170af;


5
Это SQL, и вы должны использовать параметры SQL.
jrummell

2
Зачем вам использовать REgex, если есть GUID. IsGUid
Мика Армантроут,

На самом деле параметр есть, но он такой же, как и значение в предложении where. Откуда это взялось? Профайлер?
jrummell

@jrummell Это исходит от профилировщика. Я пытаюсь преобразовать вывод таким образом, чтобы его можно было скопировать, вставить и запустить в SQL Management Studio. Это только для целей регистрации. Он по-прежнему будет запускаться как параметризованный sql.
Cole W

1
Думаю, я ошибся. Я ушел msdn.microsoft.com/en-us/library/…
Мика Армантроут,

Ответы:


183

Это довольно просто и, как вы говорите, не требует делегата.

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

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


Как написано, это не сработало бы для всех допустимых типов GUID (отсюда и обновление).
senfo

4
Это не учитывает символы нижнего регистра, которые были бы допустимыми. Используйте ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ или используйте флаг / i
Майкл Браун

@MichaelBrown Соответствует без учета регистра, см. RegexOptions.IgnoreCase в примере кода.
Buckley

1
Регулярное выражение также допускает менее 4 знаков минуса. Fyi для тех, кому это небезразлично. Для тех , кто не заботится, здесь проще регулярное выражение , которое позволяет гораздо больше ложных срабатываний: [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})$) 

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

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


Не так полно, как предложенный ответ, но +1 для ссылки regex101.com.
Джим Биллиг

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}.
Луи Сомерс

18

Чтобы 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
Принятый ответ не сработал для меня, но этот сработал!
Мерин Накарми

Здесь одна проблема. Guid будет содержать только шестнадцатеричные числа. Таким образом, буквы от az и AZ недопустимы, только af и AF. В противном случае он примет любой текст из 32 символов в качестве действительного Guid.
Мерин Накарми

То же самое - принятый ответ не сработал для меня, но этот сработал!
Грег Тревеллик,

8

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


7
Вопрос заключался в том, как найти / извлечь GUID из более длинной строки, а не проверить GUID. Предлагаю вам удалить этот ответ.
Gone Coding

13
@Micah Armantrout: Это может быть «хороший» ответ, но это не ответ на этот вопрос . Если вы просто поместите любой ответ куда угодно, это как бы побеждает цель StackOverflow :)
Gone Coding

8
Ну, для кого - то вроде меня , ищущие «регулярное выражения для справ», этот ответ был действительно самым полезным - я не действительно нужен регулярное выражение, мне нужно , чтобы соответствовать GUIDs, и эта страница является первым результатом для «регулярного выражения для обнаружения guid "в Google.
Дэн Филд

3
Второе направление @Dan Field. Я пришел сюда в поисках регулярного выражения для guid и нашел, что этот ответ был тем, что я действительно хотел. Таким образом, цель StackOverflow была выполнена.
JLScott

Это не подходящий ответ, но он, конечно, полезен. Один голос от меня. :)
Мерин Накарми

8

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

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

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

введите описание изображения здесь

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.