C # Regex untuk Guid

122

Saya perlu mengurai melalui string dan menambahkan tanda kutip tunggal di sekitar setiap nilai Panduan. Saya berpikir saya bisa menggunakan Regex untuk melakukan ini tapi saya bukan ahli Regex.

Apakah ada Regex yang bagus untuk digunakan untuk mengidentifikasi Panduan?

Pertanyaan kedua saya adalah setelah saya menemukan regex yang valid, saya anggap akan saya gunakan Regex.Replace(String, String, MatchEvaluator)tetapi saya tidak begitu yakin dengan sintaksnya. Mungkin sesuatu seperti:

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

String yang saya coba uraikan mungkin terlihat seperti ini:

"PILIH sandico0_.PASSWORD_CONFIG_ID sebagai PASSWORD1_46_0_, DARI PASSWORD_CONFIG sandico0_ DI MANA sandico0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p0e baf04077] -9

Cole W.
sumber
5
Itu adalah SQL, dan Anda harus menggunakan parameter SQL.
jrummell
2
Mengapa Anda menggunakan REgex ada GUID.IsGUid
Micah Armantrout
Sebenarnya ada parameternya, tapi nilainya sama dengan nilai di klausa where. Dari mana asalnya? Seorang profiler?
jrummell
@jrummell Ini datang dari profiler ya. Saya mencoba mengonversi output sehingga saya dapat menyalin dan menempelkannya dan menjalankannya di SQL Management Studio. Ini untuk tujuan logging saja. Ini masih akan dijalankan sebagai parametrized sql.
Cole W
1
Tebak salah saya keluar msdn.microsoft.com/en-us/library/…
Micah Armantrout

Jawaban:

182

Yang ini cukup sederhana dan tidak membutuhkan delegasi seperti yang Anda katakan.

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

Ini cocok dengan gaya berikut, yang semuanya merupakan format yang setara dan dapat diterima untuk GUID.

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

Perbarui 1

@NonStatic menegaskan dalam komentar bahwa ekspresi reguler di atas akan cocok dengan positif palsu yang memiliki pembatas penutup yang salah.

Hal ini dapat dihindari dengan regex conditional yang didukung secara luas.

Persyaratan didukung oleh mesin JGsoft, Perl, PCRE, Python, dan kerangka .NET. Ruby mendukungnya mulai dari versi 2.0. Bahasa seperti Delphi, PHP, dan R yang memiliki fitur regex berdasarkan PCRE juga mendukung kondisional. (sumber http://www.regular-expressions.info/conditional.html )

Ekspresi reguler setelah Will cocok

{123}
(123)
123

Dan tidak akan cocok

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

Ekspresi Reguler:

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

Solusinya disederhanakan agar hanya mencocokkan angka untuk menunjukkan dengan lebih jelas apa yang diperlukan jika diperlukan.

buckley
sumber
Seperti yang tertulis, ini tidak akan berfungsi untuk semua tipe GUID yang valid (karenanya pembaruan).
senfo
4
Ini tidak memperhitungkan karakter huruf kecil yang akan menjadi kasus yang valid. Gunakan ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ atau gunakan bendera / i
Michael Brown
@MichaelBrown Itu cocok case insensitive, lihat RegexOptions.IgnoreCase di contoh kode.
Buckley
1
Regex juga akan mengizinkan kurang dari 4 tanda minus. Fyi bagi yang peduli dengan hal ini. Bagi mereka yang tidak peduli, di sini adalah regex sederhana yang memungkinkan banyak positif lebih palsu: [0-9a-fA-F\-]{32,36}.
usr
1
Tidak berfungsi untukhttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic
40

Regex paling dasar adalah sebagai berikut:

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

atau Anda dapat menempelkannya di sini .

Semoga ini menghemat waktu Anda.

Matas Vaitkevicius
sumber
Tidak selengkap jawaban yang disarankan, tetapi +1 untuk tautan regex101.com.
Jim Billig
4
Dihapus pengulangan: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}The strip bisa dibuat opsional: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers
18

Untuk C #. Net untuk menemukan dan mengganti string yang mencari panduan dari teks yang diberikan,

Gunakan RegEx ini:

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

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

Pasti berhasil! Dan itu cocok & menggantikan gaya berikut, yang semuanya merupakan format yang setara dan dapat diterima untuk GUID.

"aa761232bd4211cfaacd00aa0057b243" 
"AA761232-BD42-11CF-AACD-00AA0057B243" 
"{AA761232-BD42-11CF-AACD-00AA0057B243}" 
"(AA761232-BD42-11CF-AACD-00AA0057B243)" 
GDroid
sumber
4
Jawaban yang diterima tidak berhasil untuk saya, tetapi yang ini berhasil!
Merin Nakarmi
Satu masalah di sini. Panduan hanya akan berisi angka heksadesimal. Jadi surat dari az dan AZ tidak dapat diterima tetapi hanya af dan AF. Jika tidak, itu akan menerima teks apa pun dengan 32 karakter sebagai Panduan yang valid.
Merin Nakarmi
Ditto - Jawaban yang diterima tidak berhasil untuk saya tetapi yang ini berhasil!
Greg Trevellick
8

Dalam .NET Framework 4 ada peningkatan System.Guid struktur, Ini termasuk metode TryParse dan TryParseExact baru untuk Parse GUID. Berikut adalah contoh untuk ini.

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

Dalam contoh ini kita membuat objek guid baru dan juga mengambil satu variabel string yang memiliki guid tidak valid. Setelah itu kami menggunakan metode TryParse untuk memvalidasi bahwa kedua variabel memiliki format panduan yang valid atau tidak. Dengan menjalankan contoh Anda dapat melihat bahwa variabel string tidak memiliki format guid yang valid dan memberikan pesan "InValid guid". Jika variabel string memiliki guid yang valid maka ini akan mengembalikan true dalam metode TryParse.

Jayesh Sorathia
sumber
7
Pertanyaannya adalah menanyakan bagaimana menemukan / mengekstrak GUID dari string yang lebih panjang, bukan memvalidasi GUID. Sarankan Anda menghapus jawaban ini.
Gone Coding
13
@Micah Armantrout: Ini mungkin jawaban yang "bagus", tapi itu bukan jawaban untuk pertanyaan ini . Jika Anda meletakkan jawaban apa pun di mana pun Anda suka, itu seperti mengalahkan tujuan StackOverflow :)
Gone Coding
8
Nah, untuk orang seperti saya yang menelusuri "regex untuk guid", jawaban ini benar-benar paling membantu - Saya tidak benar - benar membutuhkan regex, saya harus mencocokkan GUID, dan halaman ini adalah hasil pertama "regex untuk dideteksi guid "di Google saat ini.
Dan Field
3
Seconding @Dan Field. Saya datang ke sini untuk mencari regex untuk pedoman dan menemukan jawaban ini menjadi apa yang saya inginkan. Tujuan StackOverflow dengan demikian terpenuhi.
JLScott
Ini bukanlah jawaban yang relevan tetapi tentu saja sangat membantu. Satu suara dari saya. :)
Merin Nakarmi
8

Anda dapat dengan mudah membuat kode C # secara otomatis menggunakan: http://regexhero.net/tester/ .

Gratis.

Inilah cara saya melakukannya:

masukkan deskripsi gambar di sini

Situs web kemudian secara otomatis menghasilkan kode .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
sumber
6

Saya menggunakan pola regex yang lebih mudah

^[0-9A-Fa-f\-]{36}$
Larissa Savchekoo
sumber
Ini akan cocok dengan lebih dari GUID
Satadru Biswas