C # Regex dla Guid


122

Muszę przeanalizować ciąg i dodać pojedyncze cudzysłowy wokół każdej wartości Guid. Myślałem, że mógłbym użyć do tego Regexa, ale nie jestem dokładnie guru Regex.

Czy istnieje dobry Regex do identyfikacji Guid?

Moje drugie pytanie dotyczy znalezienia prawidłowego wyrażenia regularnego, którego, jak przypuszczam, użyłbym, Regex.Replace(String, String, MatchEvaluator)ale nie jestem do końca pewien składni. Może coś takiego:

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

Ciąg, który próbuję przeanalizować, może wyglądać następująco:

„WYBIERZ hasłoco0_.PASSWORD_CONFIG_ID as PASSWORD1_46_0_, FROM PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p045-b1b-a-070-c045-a (040-b) Type-C045-a-a-070-a)


5
To jest SQL i powinieneś używać parametrów SQL.
jrummell,

2
Dlaczego miałbyś używać REgex, jest GUID.IsGUid
Micah Armantrout

Właściwie istnieje parametr, ale jest taki sam jak wartość w klauzuli where. Skąd się to bierze? Profiler?
jrummell,

@jrummell To pochodzi od profilera tak. Próbuję przekonwertować dane wyjściowe tak, aby można było je skopiować i wkleić, a następnie uruchomić w SQL Management Studio. Służy to wyłącznie do celów logowania. Nadal będzie uruchamiany jako sparametryzowany sql.
Cole W,

1
Zgaduję, że było źle, wyszedłem msdn.microsoft.com/en-us/library/…
Micah Armantrout

Odpowiedzi:


182

Ten jest dość prosty i, jak mówisz, nie wymaga delegata.

resultString = Regex.Replace(subjectString, 
     @"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$", 
     "'$0'");

Jest to zgodne z następującymi stylami, które są równoważnymi i akceptowalnymi formatami identyfikatora GUID.

ca761232ed4211cebacd00aa0057b223
CA761232-ED42-11CE-BACD-00AA0057B223
{CA761232-ED42-11CE-BACD-00AA0057B223}
(CA761232-ED42-11CE-BACD-00AA0057B223)

Zaktualizuj 1

@NonStatic zwraca uwagę w komentarzach, że powyższe wyrażenie regularne będzie pasowało do fałszywych alarmów, które mają nieprawidłowy ogranicznik zamykający.

Można tego uniknąć, stosując powszechnie obsługiwane wyrażenia warunkowe wyrażeń regularnych.

Warunki warunkowe są obsługiwane przez silnik JGsoft, Perl, PCRE, Python i platformę .NET. Ruby obsługuje je od wersji 2.0. Języki, takie jak Delphi, PHP i R, które mają funkcje regex oparte na PCRE, również obsługują warunkowe. (źródło http://www.regular-expressions.info/conditional.html )

Wyrażenie regularne występujące po nim będzie pasować

{123}
(123)
123

I nie będzie pasować

{123)
(123}
{123
(123
123}
123)

Regex:

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

Rozwiązania są uproszczone, aby dopasować tylko liczby, aby w bardziej przejrzysty sposób pokazać, co jest wymagane w razie potrzeby.


Jak napisano, nie zadziałałoby to dla wszystkich prawidłowych typów identyfikatorów GUID (stąd aktualizacja).
senfo

4
Nie uwzględnia to małych liter, które byłyby prawidłowymi literami. Użyj ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ lub użyj flagi / i
Michael Brown

@MichaelBrown Nie uwzględnia wielkości liter, zobacz RegexOptions.IgnoreCase w przykładzie kodu.
Buckley,

1
Wyrażenie regularne dopuszcza również mniej niż 4 znaki minus. Fyi dla tych, którym na tym zależy. Dla tych, którzy nie dbają, o to prostsze regex, który umożliwia wiele więcej fałszywych alarmów: [0-9a-fA-F\-]{32,36}.
usr

1
Nie działa dlahttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic

40

Najbardziej podstawowe wyrażenie regularne jest następujące:

(^([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})$) 

lub możesz go wkleić tutaj .

Mam nadzieję, że zaoszczędzi ci to trochę czasu.


Nie tak pełna, jak sugerowana odpowiedź, ale +1 dla linku regex101.com.
Jim Billig

4
Usunięto powtórzenia: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}Kreski mogą być wykonane opcjonalnie: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers,

18

Aby C # .Net mógł znaleźć i zamienić dowolny ciąg szukający guid z podanego tekstu,

Użyj tego wyrażenia regularnego:

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

Przykładowy kod 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
);

Na pewno działa! Dopasowuje i zastępuje następujące style, które są równoważnymi i akceptowalnymi formatami identyfikatora GUID.

"aa761232bd4211cfaacd00aa0057b243" 
"AA761232-BD42-11CF-AACD-00AA0057B243" 
"{AA761232-BD42-11CF-AACD-00AA0057B243}" 
"(AA761232-BD42-11CF-AACD-00AA0057B243)" 

4
Przyjęta odpowiedź nie zadziałała dla mnie, ale ta zadziałała!
Merin Nakarmi

Jeden problem. Guid będzie zawierał tylko liczby szesnastkowe. Dlatego litery od az i AZ nie są akceptowane, ale tylko af i AF. W przeciwnym razie zaakceptowałby dowolny tekst z 32 znakami jako prawidłowy Guid.
Merin Nakarmi

Jak wyżej - zaakceptowana odpowiedź nie zadziałała dla mnie, ale ta zadziałała!
Greg Trevellick

8

W .NET Framework 4 jest ulepszona struktura System.Guid, która obejmuje nowe metody TryParse i TryParseExact do analizowania GUID. Oto przykład.

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

W tym przykładzie tworzymy nowy obiekt guid, a także pobieramy jedną zmienną łańcuchową, która ma nieprawidłowy identyfikator guid. Następnie używamy metody TryParse, aby sprawdzić, czy obie zmienne mają prawidłowy format guid, czy nie. Uruchamiając przykład możesz zobaczyć, że zmienna łańcuchowa nie ma prawidłowego formatu guid i wyświetla komunikat „InValid guid”. Jeśli zmienna łańcuchowa ma prawidłowy identyfikator GUID, to zwróci wartość true w metodzie TryParse.


7
Pytanie dotyczyło znalezienia / wyodrębnienia identyfikatora GUID z dłuższego ciągu, a nie sprawdzenia poprawności identyfikatora GUID. Zaproponuj usunięcie tej odpowiedzi.
Gone Coding

13
@Micah Armantrout: To może być „dobra” odpowiedź, ale nie jest to odpowiedź na to pytanie . Jeśli po prostu umieścisz dowolną odpowiedź w dowolnym miejscu, w pewnym sensie podważa to cel StackOverflow :)
Gone Coding

8
Cóż, dla kogoś takiego jak ja, szukającego „wyrażenia regularnego dla guid”, ta odpowiedź była naprawdę najbardziej pomocna - naprawdę nie potrzebuję wyrażenia regularnego, muszę dopasować identyfikatory GUID, a ta strona jest pierwszym wynikiem wyszukiwania wyrażenia „wyrażenie regularne” guid ”obecnie w Google.
Dan Field

3
Oddelegowanie @Dan Field. Przyszedłem tutaj, szukając wyrażenia regularnego dla guid i stwierdziłem, że ta odpowiedź jest tym, czego naprawdę chciałem. W ten sposób cel StackOverflow został spełniony.
JLScott

To nie jest właściwa odpowiedź, ale oczywiście jest pomocna. Jeden głos ode mnie. :)
Merin Nakarmi

8

Możesz łatwo automatycznie wygenerować kod C # za pomocą: http://regexhero.net/tester/ .

Jest wolne.

Oto jak to zrobiłem:

wprowadź opis obrazu tutaj

Witryna następnie automatycznie generuje kod .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);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.