C # Regex para Guid

122

Preciso analisar uma string e adicionar aspas simples em torno de cada valor de Guid. Eu estava pensando que poderia usar um Regex para fazer isso, mas não sou exatamente um guru do Regex.

Existe um bom Regex para usar para identificar um Guid?

Minha segunda pergunta é: depois de encontrar uma regex válida, presumo que usaria, Regex.Replace(String, String, MatchEvaluator)mas não tenho certeza da sintaxe. Talvez algo como:

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

Uma string que estou tentando analisar pode ter a seguinte aparência:

"SELECT passwordco0_.PASSWORD_CONFIG_ID como PASSWORD1_46_0_, de PASSWORD_CONFIG passwordco0_ ONDE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p0 = baf04077-a3c0-454b-ac6f-9fec00b8e170 [Tipo: Guid (0)]"

Cole W
fonte
5
Isso é SQL e você deve usar parâmetros SQL.
jrummell de
2
Por que você usaria REgex? Há um GUID.IsGUid
Micah Armantrout
Na verdade, há um parâmetro, mas é o mesmo que o valor da cláusula where. De onde está vindo isso? Um profiler?
jrummell de
@jrummell Isso está vindo de um criador de perfil, sim. Estou tentando converter a saída de forma que possa copiá-la, colá-la e executá-la no SQL Management Studio. Isso é apenas para fins de registro. Ele ainda será executado como sql parametrizado.
Cole W
1
Acho que estava errado. Saí msdn.microsoft.com/en-us/library/…
Micah Armantrout

Respostas:

182

Este é bastante simples e não requer um delegado, como você diz.

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

Isso corresponde aos seguintes estilos, que são todos formatos equivalentes e aceitáveis ​​para um GUID.

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

Atualização 1

@NonStatic deixa claro nos comentários que a regex acima corresponderá a falsos positivos que possuem um delimitador de fechamento incorreto.

Isso pode ser evitado por condicionais regex que são amplamente suportados.

As condicionais são suportadas pelo mecanismo JGsoft, Perl, PCRE, Python e a estrutura .NET. Ruby oferece suporte a eles a partir da versão 2.0. Linguagens como Delphi, PHP e R que possuem recursos regex baseados em PCRE também suportam condicionais. (fonte http://www.regular-expressions.info/conditional.html )

A regex que segue corresponderá

{123}
(123)
123

E não vai combinar

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

Regex:

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

As soluções são simplificadas para combinar apenas números para mostrar de forma mais clara o que é necessário, se necessário.

Buckley
fonte
Conforme escrito, isso não funcionaria para todos os tipos válidos de GUIDs (daí a atualização).
senfo
4
Isso não leva em consideração os caracteres minúsculos, que seriam um caso válido. Use ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ ou use o sinalizador / i
Michael Brown
@MichaelBrown Não faz distinção entre maiúsculas e minúsculas, consulte RegexOptions.IgnoreCase no exemplo de código.
Buckley
1
O regex também permitirá menos de 4 sinais de subtração. Fyi para aqueles que se preocupam com isso. Para aqueles que não se importam, aqui está uma regex simples que permite que muitos mais falsos positivos: [0-9a-fA-F\-]{32,36}.
usr
1
Não funciona parahttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic
40

O regex mais básico é o seguinte:

(^([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 você pode colá-lo aqui .

Espero que isso economize algum tempo.

Matas Vaitkevicius
fonte
Não tão completo quanto a resposta sugerida, mas 1 para o link regex101.com.
Jim Billig
4
Removido a repetição: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}Os traços podem ser feitas opcional: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers
18

Para C # .Net encontrar e substituir qualquer string de aparência de guid do texto fornecido,

Use este RegEx:

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

Exemplo de código 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
);

Certamente funciona! E ele corresponde e substitui os seguintes estilos, que são todos formatos equivalentes e aceitáveis ​​para um GUID.

"aa761232bd4211cfaacd00aa0057b243" 
"AA761232-BD42-11CF-AACD-00AA0057B243" 
"{AA761232-BD42-11CF-AACD-00AA0057B243}" 
"(AA761232-BD42-11CF-AACD-00AA0057B243)" 
GDroid
fonte
4
A resposta aceita não funcionou para mim, mas esta funcionou!
Merin Nakarmi de
Um problema aqui. O Guid conterá apenas números hexadecimais. Assim, as letras de az e AZ não são aceitáveis, mas apenas af e AF. Caso contrário, ele aceitaria qualquer texto com 32 caracteres como um Guid válido.
Merin Nakarmi
Idem - A resposta aceita não funcionou para mim, mas esta funcionou!
Greg Trevellick
8

No .NET Framework 4, há um aprimoramento da estrutura System.Guid, que inclui os novos métodos TryParse e TryParseExact para analisar o GUID. Aqui está um exemplo para isso.

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

Neste exemplo, criamos um novo objeto guid e também pegamos uma variável de string que tem guid inválido. Depois disso, usamos o método TryParse para validar se ambas as variáveis ​​têm formato guid válido ou não. Ao executar o exemplo, você pode ver que a variável string não tem um formato guid válido e dá a mensagem de "guid inválido". Se a variável de string tiver um guid válido, isso retornará verdadeiro no método TryParse.

Jayesh Sorathia
fonte
7
A questão era como localizar / extrair um GUID de uma string mais longa, não validar um GUID. Sugiro que você remova esta resposta.
Gone Coding
13
@Micah Armantrout: Pode ser uma "boa" resposta, mas não é uma resposta para esta pergunta . Se você simplesmente colocar qualquer resposta em qualquer lugar que quiser, meio que vai contra o propósito de StackOverflow :)
Gone Coding
8
Bem, para alguém como eu pesquisando por "regex para guid", esta resposta foi realmente a mais útil - eu realmente não preciso de um regex, preciso corresponder aos GUIDs e esta página é o primeiro resultado de "regex a detectar guid "no Google atualmente.
Dan Field
3
Apoiando o campo @Dan. Eu vim aqui em busca de regex para guid e descobri que essa resposta é o que eu realmente queria. O objetivo do StackOverflow foi assim cumprido.
JLScott
Esta não é a resposta relevante, mas é claro que é útil. Um voto meu. :)
Merin Nakarmi
8

Você pode gerar automaticamente o código C # usando: http://regexhero.net/tester/ .

É grátis.

Aqui está como eu fiz:

insira a descrição da imagem aqui

O site, então, gera automaticamente o código .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
fonte
6

Eu uso um padrão regex mais fácil

^[0-9A-Fa-f\-]{36}$
Larissa Savchekoo
fonte
Isso corresponderá a mais de GUIDs
Satadru Biswas