C # Regex สำหรับ Guid


122

ฉันต้องการแยกวิเคราะห์สตริงและเพิ่มเครื่องหมายคำพูดเดี่ยวรอบ ๆ ค่า Guid แต่ละค่า ฉันคิดว่าฉันสามารถใช้ Regex เพื่อทำสิ่งนี้ได้ แต่ฉันไม่ใช่กูรู Regex

มี Regex ที่ดีที่จะใช้ระบุ Guid หรือไม่?

คำถามที่สองของฉันคือเมื่อฉันพบ regex ที่ถูกต้องฉันคิดว่าฉันจะใช้Regex.Replace(String, String, MatchEvaluator)แต่ฉันไม่ค่อยแน่ใจเกี่ยวกับไวยากรณ์ อาจจะชอบ:

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

สตริงที่ฉันพยายามแยกวิเคราะห์อาจมีลักษณะดังนี้:

"SELECT passwordco0_.PASSWORD_CONFIG_ID เป็น PASSWORD1_46_0_, FROM PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p0 = baf3f77445


5
นั่นคือ SQL และคุณควรใช้พารามิเตอร์ SQL
jrummell

2
ทำไมคุณถึงใช้ REgex จึงมี GUID.IsGUid
Micah Armantrout

อันที่จริงมีพารามิเตอร์ แต่เหมือนกับค่าในส่วนคำสั่ง where นี้มาจากไหน? โปรไฟล์?
jrummell

@jrummell นี้มาจาก profiler ใช่ ฉันกำลังพยายามแปลงผลลัพธ์เพื่อให้ฉันสามารถคัดลอกและวางและเรียกใช้ใน SQL Management Studio นี่มีไว้เพื่อการบันทึกเท่านั้น มันจะยังคงถูกรันเป็น sql แบบพารามีทริก
Cole W

1
เดาว่าผิดฉันออกmsdn.microsoft.com/en-us/library/…
Micah Armantrout

คำตอบ:


183

อันนี้ค่อนข้างง่ายและไม่ต้องมีผู้รับมอบอำนาจอย่างที่คุณพูด

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

สิ่งนี้ตรงกับสไตล์ต่อไปนี้ซึ่งเป็นรูปแบบที่เทียบเท่าและยอมรับได้สำหรับ GUID

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

อัปเดต 1

@NonStatic ทำให้ประเด็นในความคิดเห็นว่า regex ข้างต้นจะจับคู่ผลบวกเท็จซึ่งมีตัวคั่นปิดไม่ถูกต้อง

สิ่งนี้สามารถหลีกเลี่ยงได้โดยเงื่อนไข regex ซึ่งได้รับการสนับสนุนอย่างกว้างขวาง

เงื่อนไขได้รับการสนับสนุนโดยเอ็นจิ้น JGsoft, Perl, PCRE, Python และ. NET framework Ruby รองรับตั้งแต่เวอร์ชัน 2.0 ภาษาเช่น Delphi, PHP และ R ที่มีคุณสมบัติ regex บน PCRE ก็รองรับเงื่อนไขเช่นกัน (แหล่งที่มาhttp://www.regular-expressions.info/conditional.html )

regex ที่ตามมาจะตรงกัน

{123}
(123)
123

และจะไม่ตรงกัน

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

regex:

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

โซลูชันถูกทำให้ง่ายขึ้นเพื่อให้จับคู่เฉพาะตัวเลขเพื่อแสดงให้ชัดเจนยิ่งขึ้นว่าต้องใช้อะไรบ้างหากจำเป็น


ตามที่เขียนไว้สิ่งนี้จะใช้ไม่ได้กับ GUID ทุกประเภทที่ถูกต้อง (ดังนั้นการอัปเดต)
senfo

4
สิ่งนี้ไม่ได้อธิบายถึงอักขระตัวพิมพ์เล็กซึ่งจะเป็นกรณีที่ถูกต้อง ใช้ ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ หรือใช้แฟ
Michael Brown

@MichaelBrown ไม่ตรงกับตัวพิมพ์เล็กและใหญ่โปรดดู RegexOptions.IgnoreCase ในตัวอย่างโค้ด
buckley

1
regex จะอนุญาตให้มีเครื่องหมายลบน้อยกว่า 4 Fyi สำหรับผู้ที่สนใจเกี่ยวกับเรื่องนี้ สำหรับผู้ที่ไม่สนใจที่นี่เป็น regex [0-9a-fA-F\-]{32,36}ง่ายที่ช่วยให้หลายบวกเท็จเพิ่มเติมได้ที่:
usr

1
ไม่ทำงานสำหรับhttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic

40

regex พื้นฐานส่วนใหญ่มีดังต่อไปนี้:

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

หรือจะวางที่นี่ก็ได้

หวังว่านี่จะช่วยคุณประหยัดเวลาได้บ้าง


ไม่ครบถ้วนเท่ากับคำตอบที่แนะนำ แต่ +1 สำหรับลิงก์ regex101.com
Jim Billig

4
ลบการทำซ้ำ: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}ขีดกลางสามารถเลือกได้: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers

19

เพื่อให้ C # .Net ค้นหาและแทนที่สตริงที่มองหา guid จากข้อความที่กำหนด

ใช้ RegEx นี้:

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

ตัวอย่างรหัส 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
);

ได้ผลแน่นอน! และจะจับคู่และแทนที่สไตล์ต่อไปนี้ซึ่งเป็นรูปแบบที่เทียบเท่าและยอมรับได้สำหรับ GUID

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

4
คำตอบที่ยอมรับไม่ได้ผลสำหรับฉัน แต่คำตอบนี้ทำได้!
Merin Nakarmi

ปัญหาหนึ่งที่นี่ Guid จะมีเฉพาะเลขฐานสิบหกเท่านั้น ดังนั้นตัวอักษรจาก az และ AZ จึงไม่เป็นที่ยอมรับ แต่มีเพียง AF และ AF เท่านั้น มิฉะนั้นจะยอมรับข้อความใด ๆ ที่มีอักขระ 32 ตัวเป็น Guid ที่ถูกต้อง
Merin Nakarmi

Ditto - คำตอบที่ยอมรับไม่ได้ผลสำหรับฉัน แต่คำตอบนี้ทำได้!
Greg Trevellick

8

ใน. NET Framework 4 มีการปรับปรุงโครงสร้าง System.Guid ซึ่งรวมถึงเมธอด TryParse และ TryParseExact ใหม่เพื่อแยกวิเคราะห์ GUID นี่คือตัวอย่างสำหรับสิ่งนี้

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

ในตัวอย่างนี้เราสร้าง guid object ใหม่และรับตัวแปรสตริงหนึ่งตัวที่มี guid ไม่ถูกต้อง หลังจากนั้นเราใช้เมธอด TryParse เพื่อตรวจสอบว่าตัวแปรทั้งสองมีรูปแบบ guid ที่ถูกต้องหรือไม่ จากการเรียกใช้ตัวอย่างคุณจะเห็นว่าตัวแปรสตริงมีรูปแบบ guid ที่ไม่ถูกต้องและให้ข้อความ "InValid guid" หากตัวแปรสตริงมีแนวทางที่ถูกต้องกว่านี้จะส่งคืนจริงในเมธอด TryParse


7
คำถามคือถามวิธีค้นหา / แยก GUID จากสตริงที่ยาวกว่าไม่ใช่ตรวจสอบ GUID แนะนำให้คุณลบคำตอบนี้
Gone Coding

13
@Micah Armantrout: อาจเป็นคำตอบที่ "ดี" แต่ไม่ใช่คำตอบสำหรับคำถามนี้ หากคุณเพียงแค่ใส่คำตอบที่ใดก็ได้ที่คุณต้องการมันเป็นการเอาชนะจุดประสงค์ของ StackOverflow :)
Gone Coding

8
สำหรับคนอย่างฉันที่ค้นหา "regex for guid" คำตอบนี้มีประโยชน์มากที่สุด - ฉันไม่ต้องการ regex จริงๆฉันต้องจับคู่ GUID และหน้านี้เป็นผลลัพธ์แรกสำหรับ "regex เพื่อตรวจจับ guid "บน Google ในปัจจุบัน
Dan Field

3
วินาทีที่ @ ด่านแดน. ฉันมาที่นี่เพื่อค้นหา regex สำหรับ guid และพบว่าคำตอบนี้เป็นสิ่งที่ฉันต้องการจริงๆ วัตถุประสงค์ของ StackOverflow จึงสำเร็จ
JLScott

นี่ไม่ใช่คำตอบที่เกี่ยวข้อง แต่แน่นอนว่ามีประโยชน์ หนึ่งคะแนนจากฉัน :)
Merin Nakarmi

8

คุณสามารถอัตโนมัติสร้างรหัส C # โดยใช้: http://regexhero.net/tester/

แจกฟรี.

นี่คือวิธีที่ฉันทำ:

ใส่คำอธิบายภาพที่นี่

จากนั้นเว็บไซต์จะสร้างรหัส. 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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.