Regex C # per Guid


122

Devo analizzare una stringa e aggiungere virgolette singole attorno a ciascun valore Guid. Stavo pensando di poter usare un Regex per farlo, ma non sono esattamente un guru Regex.

Esiste un buon Regex da utilizzare per identificare un Guid?

La mia seconda domanda è una volta trovata una regex valida che presumo di utilizzare Regex.Replace(String, String, MatchEvaluator)ma non sono abbastanza sicuro della sintassi. Forse qualcosa come:

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

Una stringa che sto cercando di analizzare potrebbe essere simile a questa:

"SELEZIONA passwordco0_.PASSWORD_CONFIG_ID come PASSWORD1_46_0_, DA PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p045e170;


5
Questo è SQL e dovresti usare i parametri SQL.
jrummell

2
Perché dovresti usare REgex c'è un GUID.IsGUid
Micah Armantrout

In realtà, c'è un parametro, ma è lo stesso del valore nella clausola where. Da dove viene questo? Un profiler?
jrummell

@jrummell Questo viene da un profiler yeah. Sto provando a convertire l'output in modo da poterlo copiare e incollare ed eseguirlo in SQL Management Studio. Questo è solo a scopo di registrazione. Verrà comunque eseguito come sql parametrizzato.
Cole W

1
Immagino che fosse sbagliato, ho fuori msdn.microsoft.com/en-us/library/…
Micah Armantrout

Risposte:


182

Questo è abbastanza semplice e non richiede un delegato come dici tu.

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

Ciò corrisponde ai seguenti stili, che sono tutti formati equivalenti e accettabili per un GUID.

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

Aggiorna 1

@NonStatic sottolinea nei commenti che la regex di cui sopra corrisponderà a falsi positivi che hanno un delimitatore di chiusura errato.

Questo può essere evitato dalle espressioni regolari che sono ampiamente supportate.

I condizionali sono supportati dal motore JGsoft, Perl, PCRE, Python e .NET framework. Ruby li supporta a partire dalla versione 2.0. Linguaggi come Delphi, PHP e R che hanno funzionalità regex basate su PCRE supportano anche i condizionali. (fonte http://www.regular-expressions.info/conditional.html )

La regex che segue Will match

{123}
(123)
123

E non corrisponderà

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

regex:

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

Le soluzioni sono semplificate per abbinare solo numeri per mostrare in modo più chiaro ciò che è necessario se necessario.


Come scritto, questo non avrebbe funzionato per tutti i tipi validi di GUID (da qui l'aggiornamento).
senfo

4
Questo non tiene conto dei caratteri minuscoli che sarebbero un caso valido. Usa ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ o usa il flag / i
Michael Brown,

@MichaelBrown Non fa distinzione tra maiuscole e minuscole, vedere RegexOptions.IgnoreCase nell'esempio di codice.
Buckley

1
L'espressione regolare consentirà anche meno di 4 segni meno. Cordiali saluti per coloro che ci tengono a questo. Per coloro che non si curano, ecco un'espressione regolare più semplice che permette a molti più falsi positivi: [0-9a-fA-F\-]{32,36}.
usr

1
Non funziona perhttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic

40

La maggior parte delle espressioni regolari di base è la seguente:

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

oppure puoi incollarlo qui .

Spero che questo ti faccia risparmiare tempo.


Non abbastanza completo come la risposta suggerita, ma +1 per il link regex101.com.
Jim Billig

4
Rimosso la ripetizione: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}I trattini potrebbero essere resi facoltativi: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers

18

Affinché C # .Net trovi e sostituisca qualsiasi stringa di ricerca guidata dal testo specificato,

Usa questa RegEx:

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

Codice C # di esempio:

var result = Regex.Replace(
      source, 
      @"[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?", 
      @"${ __UUID}", 
      RegexOptions.IgnoreCase
);

Sicuramente funziona! E corrisponde e sostituisce i seguenti stili, che sono tutti formati equivalenti e accettabili per un GUID.

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

4
La risposta accettata non ha funzionato per me, ma questa ha funzionato!
Merin Nakarmi

Un problema qui. Guid conterrà solo numeri esadecimali. Quindi le lettere da az e AZ non sono accettabili ma solo af e AF. Altrimenti accetterebbe qualsiasi testo con 32 caratteri come Guid valido.
Merin Nakarmi

Idem - La risposta accettata non ha funzionato per me, ma questa ha funzionato!
Greg Trevellick

8

In .NET Framework 4 è presente un miglioramento della struttura System.Guid, che include nuovi metodi TryParse e TryParseExact per Parse GUID. Ecco un esempio per questo.

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

In questo esempio creiamo un nuovo oggetto guid e prendiamo anche una variabile stringa che ha guid non valido. Dopodiché utilizziamo il metodo TryParse per verificare che entrambe le variabili abbiano o meno un formato guid valido. Eseguendo l'esempio puoi vedere che la variabile stringa non ha un formato guid valido e fornisce un messaggio di "guid non valido". Se la variabile stringa ha un guid valido, questo restituirà true nel metodo TryParse.


7
La domanda era come trovare / estrarre un GUID da una stringa più lunga, non come convalidare un GUID. Suggerisco di rimuovere questa risposta.
Gone Coding

13
@Micah Armantrout: potrebbe essere una "buona" risposta, ma non è una risposta a questa domanda . Se metti una risposta ovunque desideri, in un certo senso sconfigge lo scopo di StackOverflow :)
Gone Coding

8
Bene, per qualcuno come me che cerca una "regex per guid", questa risposta è stata davvero la più utile - non ho davvero bisogno di una regex, ho bisogno di abbinare i GUID e questa pagina è il primo risultato per "regex da rilevare guid "su Google attualmente.
Dan Field

3
Seconding @Dan Field. Sono venuto qui alla ricerca di regex per guid e ho trovato questa risposta come quello che volevo veramente. Lo scopo di StackOverflow è stato quindi raggiunto.
JLScott

Questa non è la risposta pertinente, ma ovviamente è utile. Un voto da parte mia. :)
Merin Nakarmi

8

Puoi facilmente generare automaticamente il codice C # utilizzando: http://regexhero.net/tester/ .

È gratis.

Ecco come l'ho fatto:

inserisci qui la descrizione dell'immagine

Il sito Web quindi genera automaticamente il codice .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);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.