Kılavuz için C # Regex


122

Bir dizeyi ayrıştırmam ve her Guid değerinin etrafına tek tırnak eklemem gerekiyor. Bunu yapmak için bir Regex kullanabileceğimi düşünüyordum ama tam olarak bir Regex gurusu değilim.

Bir Rehberi tanımlamak için kullanılacak iyi bir Normal İfade var mı?

İkinci sorum, kullanacağımı varsaydığım geçerli bir normal ifade bulduğumda, Regex.Replace(String, String, MatchEvaluator)ancak sözdiziminden tam olarak emin değilim. Belki şöyle bir şey:

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

Ayrıştırmaya çalıştığım bir dize şöyle görünebilir:

"Passwordco0_.PASSWORD_CONFIG_ID'yi PASSWORD1_46_0_, FROM PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p017-b8e170 yazın;


5
Bu SQL'dir ve SQL parametreleri kullanmalısınız.
jrummell

2
REgex'i neden kullanasınız ki bir GUID var.IsGUid
Micah Armantrout

Aslında bir parametre vardır, ancak bu, where cümlesindeki değerle aynıdır. Bu nereden geliyor? Profilci mi?
jrummell

@jrummell Bu bir profilciden geliyor evet. Çıktıyı kopyalayıp yapıştırıp SQL Management Studio'da çalıştırabilecek şekilde dönüştürmeye çalışıyorum. Bu, yalnızca günlük kaydı amaçlıdır. Yine de parametrize sql olarak çalıştırılacaktır.
Cole W

Yanıtlar:


183

Bu oldukça basit ve dediğiniz gibi bir temsilci gerektirmiyor.

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

Bu, tümü bir GUID için eşdeğer ve kabul edilebilir biçimler olan aşağıdaki stillerle eşleşir.

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

Güncelleme 1

@NonStatic, yorumlarda yukarıdaki normal ifadenin yanlış kapanış sınırlayıcısı olan yanlış pozitiflerle eşleşeceğini belirtiyor.

Bu, geniş ölçüde desteklenen normal ifade koşullarıyla önlenebilir.

Koşul ifadeleri JGsoft motoru, Perl, PCRE, Python ve .NET çerçevesi tarafından desteklenir. Ruby, sürüm 2.0'dan başlayarak bunları destekler. PCRE'ye dayalı düzenli ifade özelliklerine sahip Delphi, PHP ve R gibi diller de koşullu ifadeleri destekler. (kaynak http://www.regular-expressions.info/conditional.html )

Eşleşecek'i izleyen normal ifade

{123}
(123)
123

Ve eşleşmeyecek

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

regex:

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

Çözümler, gerektiğinde neyin gerekli olduğunu daha net bir şekilde göstermek için yalnızca sayılarla eşleşecek şekilde basitleştirilmiştir.


Yazıldığı gibi, bu, tüm geçerli GUID türleri için işe yaramazdı (dolayısıyla güncelleme).
senfo

4
Bu, geçerli bir durum olan küçük harf karakterlerini hesaba katmaz. ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ veya / i işaretini kullanın
Michael Brown

@MichaelBrown Büyük / küçük harfe duyarlı değildir, kod örneğindeki RegexOptions.IgnoreCase bölümüne bakın.
buckley

1
Normal ifade ayrıca 4'ten az eksi işaretine izin verir. Bunu önemseyenler için Fyi. Umurumda değil olanlar için, burada çok daha fazla yanlış pozitif izin veren daha basit bir regex geçerli: [0-9a-fA-F\-]{32,36}.
usr

1
İçin çalışmıyorhttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic

40

Çoğu temel normal ifade şu şekildedir:

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

veya buraya yapıştırabilirsiniz .

Umarım bu size biraz zaman kazandırır.


Önerilen yanıt kadar tam değil, ancak regex101.com bağlantısı için +1.
Jim Billig

4
Tekrarını Kaldırıldı: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}tire isteğe yapılmış olabilir: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers

19

C # .Net'in verilen metinden herhangi bir kılavuz görünümlü dizeyi bulup değiştirmesi için,

Bu Normal İfadeyi kullanın:

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

Örnek C # kodu:

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

Kesinlikle işe yarıyor! Ve bir GUID için tümü eşdeğer ve kabul edilebilir biçimler olan aşağıdaki stillerle eşleşir ve bunların yerini alır.

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

4
Kabul edilen cevap benim için işe yaramadı ama bu işe yaradı!
Merin Nakarmi

Burada bir sorun var. Kılavuz yalnızca onaltılık sayılar içerecektir. Bu nedenle az ve AZ'den gelen harfler kabul edilebilir değil, sadece af ve AF'dir. Aksi takdirde, 32 karakterlik herhangi bir metni geçerli bir Kılavuz olarak kabul ederdi.
Merin Nakarmi

Ditto - Kabul edilen cevap benim için işe yaramadı ama bu işe yaradı!
Greg Trevellick

8

.NET Framework 4'te System.Guid yapısı geliştirme vardır, Bunlar GUID Ayrıştırmak için yeni TryParse ve TryParseExact yöntemlerini içerir. İşte bunun için bir örnek.

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

Bu örnekte, yeni guid nesnesi oluşturuyoruz ve ayrıca geçersiz guid'e sahip bir string değişken alıyoruz. Bundan sonra her iki değişkenin de geçerli bir kılavuz biçimine sahip olup olmadığını doğrulamak için TryParse yöntemini kullanıyoruz. Örneği çalıştırdığınızda, string değişkeninin geçerli bir kılavuz formatı olmadığını ve "Geçersiz kılavuz" mesajını verdiğini görebilirsiniz. Dize değişkeninin geçerli bir kılavuzu varsa, bu, TryParse yönteminde true değerini döndürür.


7
Soru, bir GUID'yi doğrulamak değil, daha uzun bir dizeden bir GUID'nin nasıl bulunacağını / çıkarılacağını sormaktı. Bu yanıtı kaldırmanızı öneririm.
Kodlamaya Gitti

13
@Micah Armantrout: Bu bir "iyi" cevabı olabilir, ama bu bir cevap değil bu soruya . Herhangi bir yanıtı istediğiniz yere koyarsanız, bu StackOverflow'un amacını bozar :)
Gone Coding

8
Pekala, benim gibi bir "kılavuz için regex" arayan biri için bu cevap gerçekten en yararlı olanıydı - gerçekten bir normal ifadeye ihtiyacım yok , GUID'leri eşleştirmem gerekiyor ve bu sayfa, "regex'in guid "şu anda Google'da.
Dan Tarla

3
@Dan Alanını Seconding. Buraya bir normal ifade aramaya geldim ve bu cevabı gerçekten istediğim şey olarak buldum. StackOverflow'un amacı böylece yerine getirildi.
JLScott

Bu konuyla ilgili cevap değil ama elbette faydalıdır. Benden bir oy. :)
Merin Nakarmi

8

Şu adresi kullanarak C # kodunu kolayca otomatik olarak oluşturabilirsiniz: http://regexhero.net/tester/ .

Bedava.

İşte böyle yaptım:

görüntü açıklamasını buraya girin

Web sitesi daha sonra .NET kodunu otomatik olarak oluşturur:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.