C # Regex для керівництва


122

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

Чи є корисний Regex для виявлення Керівництва?

Моє друге запитання, як тільки я знайшов дійсний регулярний вираз, я припускаю, що буду використовувати, 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_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @00c00c0f0c0f0c0f0c0c0f0fc0f0c0b0e070c_0f0b0e070e0701_00c0f0fc0f0c0f0c0fcb0fcb0fcb0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"


5
Це SQL, і ви повинні використовувати параметри SQL.
jrummell

2
Навіщо використовувати REgex? Є GUID.IsGUid
Micah Armantrout

Насправді параметр є, але він такий самий, як і значення в пункті де. Звідки це походить? Профілер?
jrummell

@jrummell Це походить від профайлера так. Я намагаюся перетворити висновок таким чином, щоб його можна було скопіювати і вставити і запустити в SQL Management Studio. Це лише для ведення журналу. Він все ще буде використовуватися як параметризований sql.
Коул Ч

1
Здогадайтесь, помилявся, я вимкнув msdn.microsoft.com/en-us/library/…
Міхей Армантрот

Відповіді:


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 Framework. 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 (отже, оновлення).
сенфо

4
Це не враховує малі регістри, які були б дійсними. Використовуйте ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}] $ або використовувати прапор / i
Майкл Браун

@MichaelBrown Це відповідає нечутливим до регістру, див. RegexOptions.IgnoreCase у зразку коду.
Баклі

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 знайшов і замінив будь-який рядок, що шукає орієнтир, із даного тексту,

Використовуйте цей 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
Прийнята відповідь не працювала для мене, але ця зробила!
Merin Nakarmi

Тут одна проблема. Посібник міститиме лише шістнадцяткові числа. Таким чином, листи від az та AZ неприйнятні, але лише af та AF. В іншому випадку він приймає будь-який текст із 32 символами як дійсний Посібник.
Merin Nakarmi

Дітто - прийнята відповідь не працювала для мене, але ця зробила!
Грег Тревелік

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));
    }

У цьому прикладі ми створюємо новий об’єкт guide, а також беремо одну змінну рядка, яка має недійсну настанову. Після цього ми використовуємо метод TryParse для перевірки того, що обидві змінні мають дійсний формат настанови чи ні. Запустивши приклад, ви можете побачити, що змінна строка не має дійсного формату наведення, і вона дає повідомлення "InValid guide". Якщо строкова змінна має дійсну настанову, це поверне значення true у методі TryParse.


7
Питання полягало в тому, щоб знайти / витягти GUID з більш тривалої строки, а не перевірити GUID. Запропонуйте видалити цю відповідь.
Пройшов кодування

13
@Micah Armantrout: Це може бути "гарна" відповідь, але це не відповідь на це питання . Якщо ви просто помістите будь-яку відповідь куди завгодно, це ніби перемагає мету StackOverflow :)
кодування

8
Ну а для когось, як я, що шукає «регулярний вираз для орієнтиру», ця відповідь справді була найбільш корисною - мені не дуже потрібен регулярний вираз, мені потрібно відповідати GUID, і ця сторінка є першим результатом для «регулярного вираження для виявлення на даний момент "в Google.
Dan Field

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

Це не відповідна відповідь, але це, звичайно, корисно. Один голос від мене. :)
Merin Nakarmi

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.