C # Regex pour Guid

122

J'ai besoin d'analyser une chaîne et d'ajouter des guillemets simples autour de chaque valeur Guid. Je pensais que je pourrais utiliser un Regex pour faire ça mais je ne suis pas exactement un gourou Regex.

Existe-t-il un bon Regex à utiliser pour identifier un Guid?

Ma deuxième question est une fois que j'ai trouvé une regex valide, je suppose que j'utiliserais Regex.Replace(String, String, MatchEvaluator)mais je ne suis pas tout à fait sûr de la syntaxe. Peut-être quelque chose comme:

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

Une chaîne que j'essaie d'analyser peut ressembler à ceci:

"SELECT passwordco0_.PASSWORD_CONFIG_ID en tant que PASSWORD1_46_0_, FROM PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170-ac6f-9fec00b8e170-ac6b-ac6f-9fec00b8e170; @ p08b-9fec00b8e170 (0)

Cole W
la source
5
C'est SQL, et vous devriez utiliser des paramètres SQL.
jrummell le
2
Pourquoi utiliseriez-vous REgex il y a un GUID.IsGUid
Micah Armantrout
En fait, il existe un paramètre, mais c'est le même que la valeur de la clause where. D'où cela vient-il? Un profileur?
jrummell
@jrummell Cela vient d'un profileur ouais. J'essaie de convertir la sortie de sorte que je puisse la copier et la coller et l'exécuter dans SQL Management Studio. Ceci est uniquement à des fins de journalisation. Il sera toujours exécuté en tant que sql paramétré.
Cole W
1
Je suppose
Micah Armantrout

Réponses:

182

Celui-ci est assez simple et ne nécessite pas de délégué comme vous le dites.

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

Cela correspond aux styles suivants, qui sont tous des formats équivalents et acceptables pour un GUID.

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

Mise à jour 1

@NonStatic fait remarquer dans les commentaires que l'expression rationnelle ci-dessus correspondra aux faux positifs qui ont un délimiteur de fermeture incorrect.

Cela peut être évité par des conditions regex qui sont largement prises en charge.

Les conditions sont prises en charge par le moteur JGsoft, Perl, PCRE, Python et le framework .NET. Ruby les prend en charge à partir de la version 2.0. Les langages tels que Delphi, PHP et R qui ont des fonctionnalités regex basées sur PCRE prennent également en charge les conditions. (source http://www.regular-expressions.info/conditional.html )

La regex qui suit correspondra

{123}
(123)
123

Et ne correspondra pas

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

Regex:

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

Les solutions sont simplifiées pour ne faire correspondre que des nombres pour montrer de manière plus claire ce qui est requis si nécessaire.

Buckley
la source
Tel qu'écrit, cela n'aurait pas fonctionné pour tous les types valides de GUID (d'où la mise à jour).
senfo
4
Cela ne tient pas compte des caractères minuscules qui seraient une casse valide. Utilisez ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ ou utilisez l'indicateur / i
Michael Brown
@MichaelBrown Il ne correspond pas à la casse, voir RegexOptions.IgnoreCase dans l'exemple de code.
buckley
1
Le regex autorisera également moins de 4 signes moins. Fyi pour ceux qui se soucient de cela. Pour ceux qui s'en moquent, voici une expression régulière plus simple qui autorise beaucoup plus de faux positifs:[0-9a-fA-F\-]{32,36} .
usr
1
Ne fonctionne pas pourhttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic
40

La plupart des expressions régulières de base sont les suivantes:

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

ou vous pouvez le coller ici .

J'espère que cela vous fera gagner du temps.

Matas Vaitkevicius
la source
Pas aussi complet que la réponse suggérée, mais +1 pour le lien regex101.com.
Jim Billig
4
Suppression de la répétition: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}Les tirets peuvent être en option: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers
18

Pour que C # .Net trouve et remplace toute chaîne de recherche guid à partir du texte donné,

Utilisez ce RegEx:

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

Exemple de code 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
);

Fonctionne sûrement! Et il correspond et remplace les styles suivants, qui sont tous des formats équivalents et acceptables pour un GUID.

"aa761232bd4211cfaacd00aa0057b243" 
"AA761232-BD42-11CF-AACD-00AA0057B243" 
"{AA761232-BD42-11CF-AACD-00AA0057B243}" 
"(AA761232-BD42-11CF-AACD-00AA0057B243)" 
GDroid
la source
4
La réponse acceptée n'a pas fonctionné pour moi mais celle-ci l'a fait!
Merin Nakarmi le
Un problème ici. Guid ne contiendra que des nombres hexadécimaux. Ainsi, les lettres de az et AZ ne sont pas acceptables mais seulement af et AF. Sinon, il accepterait tout texte de 32 caractères comme Guid valide.
Merin Nakarmi
Idem - La réponse acceptée n'a pas fonctionné pour moi mais celle-ci a fonctionné!
Greg Trevellick il y a
8

Dans .NET Framework 4, il y a une amélioration de la structure System.Guid, qui inclut les nouvelles méthodes TryParse et TryParseExact pour analyser le GUID. Voici un exemple pour cela.

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

Dans cet exemple, nous créons un nouvel objet guid et prenons également une variable de chaîne dont le guid est invalide. Après cela, nous utilisons la méthode TryParse pour valider que les deux variables ont un format GUID valide ou non. En exécutant l'exemple, vous pouvez voir que la variable de chaîne n'a pas le format GUID valide et qu'elle donne le message "InValid guid". Si la variable de chaîne a un guid valide, cela retournera true dans la méthode TryParse.

Jayesh Sorathia
la source
7
La question demandait comment trouver / extraire un GUID à partir d'une chaîne plus longue, et non valider un GUID. Je vous suggère de supprimer cette réponse.
Fini le codage
13
@Micah Armantrout: C'est peut-être une "bonne" réponse, mais ce n'est pas une réponse à cette question . Si vous mettez une réponse où vous voulez, cela va à l'encontre de l'objectif de StackOverflow :)
Fini le codage
8
Eh bien, pour quelqu'un comme moi à la recherche d'un "regex for guid", cette réponse était vraiment la plus utile - je n'ai pas vraiment besoin d'une regex, j'ai besoin de faire correspondre les GUID, et cette page est le premier résultat pour "regex à détecter guid "sur Google actuellement.
Dan Field
3
Appuyant @Dan Field. Je suis venu ici à la recherche de regex pour guid et j'ai trouvé que cette réponse était ce que je voulais vraiment. Le but de StackOverflow était ainsi rempli.
JLScott
Ce n'est pas la réponse pertinente mais elle est bien sûr utile. Un vote de ma part. :)
Merin Nakarmi
8

Vous pouvez facilement générer automatiquement le code C # en utilisant: http://regexhero.net/tester/ .

C'est gratuit.

Voici comment je l'ai fait:

entrez la description de l'image ici

Le site Web génère ensuite automatiquement le code .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);
Contango
la source
6

J'utilise un modèle de regex plus simple

^[0-9A-Fa-f\-]{36}$
Larissa Savchekoo
la source
Cela correspondra à plus de GUID
Satadru Biswas