Regex เพื่อแยกสตริงใน Excel (ตรงกันหนึ่งรายการหรือทั้งหมด)

  • แบ่งปันสิ่งนี้
Michael Brown

สารบัญ

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้นิพจน์ทั่วไปใน Excel เพื่อค้นหาและแยกสตริงย่อยที่ตรงกับรูปแบบที่กำหนด

Microsoft Excel มีฟังก์ชันมากมายในการแยกข้อความ จากเซลล์ ฟังก์ชันเหล่านั้นสามารถรับมือกับความท้าทายในการดึงสตริงส่วนใหญ่ในเวิร์กชีตของคุณได้ มากที่สุด แต่ไม่ใช่ทั้งหมด เมื่อฟังก์ชัน Text สะดุด นิพจน์ทั่วไปจะเข้ามาช่วย เดี๋ยวก่อน… Excel ไม่มีฟังก์ชัน RegEx! จริง ไม่มีฟังก์ชั่นในตัว แต่ไม่มีอะไรที่จะป้องกันคุณจากการใช้ของคุณเอง :)

    ฟังก์ชัน Excel VBA Regex เพื่อแยกสตริง

    หากต้องการเพิ่มฟังก์ชันแยก Regex แบบกำหนดเองไปยัง Excel ของคุณ วางรหัสต่อไปนี้ในตัวแก้ไข VBA เพื่อเปิดใช้งานนิพจน์ทั่วไปใน VBA เรากำลังใช้วัตถุ Microsoft RegExp ในตัว

    Public Function RegExpExtract(text As String , pattern As String , optional instance_num As Integer = 0, optional match_case As Boolean = True ) Dim text_matches() เป็นสตริง Dim ตรงกัน_index เป็นจำนวนเต็มเมื่อเกิดข้อผิดพลาด GoTo ErrHandl RegExpExtract = "" ตั้งค่า regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = รูปแบบ regex.Global = True regex.MultiLine = True ถ้า True = match_case จากนั้น regex เพิกเฉย = เท็จ อื่น regex.ignorecase = True End หากชุดตรงกัน = regex.Execute (ข้อความ) ถ้า 0 < ตรงกัน นับแล้ว ถ้า (0 = instance_num) จากนั้น ReDim text_matches (ตรงกันนับ - 1, 0) สำหรับ match_index = 0 ถึงVBA RegExp ฉันขอแนะนำให้คุณอ่านส่วนถัดไปที่กล่าวถึงฟังก์ชัน .NET Regex ที่มีประสิทธิภาพมากขึ้น

    ฟังก์ชัน Regex ที่ใช้ .NET แบบกำหนดเองเพื่อแยกข้อความใน Excel

    ไม่เหมือนกับฟังก์ชัน VBA RegExp ที่ สามารถเขียนโดยผู้ใช้ Excel ใด ๆ .NET RegEx เป็นขอบเขตของนักพัฒนา Microsoft .NET Framework รองรับไวยากรณ์นิพจน์ทั่วไปที่มีคุณสมบัติครบถ้วนซึ่งเข้ากันได้กับ Perl 5 บทความนี้จะไม่สอนวิธีเขียนฟังก์ชันดังกล่าว (ฉันไม่ใช่โปรแกรมเมอร์และไม่มีความคิดเพียงเล็กน้อยเกี่ยวกับวิธีการทำเช่นนั้น :)

    สี่ฟังก์ชันอันทรงพลังที่ประมวลผลโดยเอ็นจิ้น .NET RegEx มาตรฐานนั้นเขียนขึ้นโดยนักพัฒนาของเราแล้วและรวมอยู่ใน Ultimate Suite ด้านล่าง เราจะสาธิตการใช้งานฟังก์ชันที่ออกแบบมาเป็นพิเศษสำหรับการแยกข้อความใน Excel

    เคล็ดลับ สำหรับข้อมูลเกี่ยวกับไวยากรณ์ .NET Regex โปรดดูที่ .NET Regular Expression Language

    วิธีแยก stings ใน Excel โดยใช้นิพจน์ทั่วไป

    สมมติว่าคุณติดตั้ง Ultimate Suite เวอร์ชันล่าสุดแล้ว การแยกข้อความโดยใช้นิพจน์ทั่วไปจะสรุปเป็นสองขั้นตอนต่อไปนี้:

    1. บนแท็บ Ablebits Data ในกลุ่ม Text ให้คลิก Regex Tools
    2. ในบานหน้าต่าง Regex Tools เลือกแหล่งข้อมูล ป้อนรูปแบบ Regex ของคุณ และเลือกตัวเลือก แตกไฟล์ ในการรับผลลัพธ์เป็นฟังก์ชันแบบกำหนดเอง ไม่ใช่ค่า ให้เลือกเครื่องหมายถูก แทรกเป็นสูตร กล่อง. เมื่อเสร็จแล้ว ให้คลิกปุ่ม แตกไฟล์

    ผลลัพธ์จะปรากฏในคอลัมน์ใหม่ทางด้านขวาของข้อมูลเดิมของคุณ:

    ไวยากรณ์ของ AblebitsRegexExtract

    ฟังก์ชันที่กำหนดเองของเรามีรูปแบบดังต่อไปนี้:

    AblebitsRegexExtract(reference, Regular_expression)

    ที่ไหน:

    • อ้างอิง (จำเป็น) - การอ้างอิงไปยังเซลล์ที่มีสตริงต้นฉบับ
    • Regular_expression (จำเป็น) - รูปแบบ regex ที่ตรงกัน

    หมายเหตุสำคัญ! ฟังก์ชันนี้ใช้งานได้กับเครื่องที่ติดตั้ง Ultimate Suite for Excel เท่านั้น

    บันทึกการใช้งาน

    เพื่อให้ช่วงการเรียนรู้ของคุณราบรื่นขึ้นและประสบการณ์ของคุณสนุกสนานยิ่งขึ้น โปรดใส่ใจกับประเด็นเหล่านี้:

    1. ในการสร้างสูตร คุณสามารถใช้ เครื่องมือ Regex หรือไดอะล็อก แทรกฟังก์ชัน ของ Excel หรือพิมพ์ชื่อฟังก์ชันแบบเต็มในเซลล์ เมื่อใส่สูตรแล้ว คุณสามารถจัดการ (แก้ไข คัดลอก หรือย้าย) ได้เหมือนกับสูตรทั่วไป
    2. รูปแบบที่คุณป้อนในบานหน้าต่าง Regex Tools ไปที่อาร์กิวเมนต์ที่ 2 นอกจากนี้ยังสามารถเก็บนิพจน์ทั่วไปไว้ในเซลล์ที่แยกจากกันได้อีกด้วย ในกรณีนี้ เพียงใช้การอ้างอิงเซลล์สำหรับอาร์กิวเมนต์ที่ 2
    3. ฟังก์ชันจะแยก การจับคู่ที่พบครั้งแรก
    4. โดยค่าเริ่มต้น ฟังก์ชันคือ ตัวพิมพ์เล็กและใหญ่ -ไว . สำหรับการจับคู่ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ให้ใช้รูปแบบ (?i)
    5. หากไม่พบการจับคู่ ข้อผิดพลาด #N/A คือส่งคืน

    Regex เพื่อแยกสตริงระหว่างอักขระสองตัว

    หากต้องการรับข้อความระหว่างอักขระสองตัว คุณสามารถใช้กลุ่มการจับภาพหรือการมองไปรอบๆ

    มา สมมติว่าคุณต้องการแยกข้อความระหว่างวงเล็บ การจับกลุ่มเป็นวิธีที่ง่ายที่สุด

    รูปแบบ 1 : \[(.*?)\]

    ด้วยการมองไปข้างหลังและมองไปข้างหน้า ผลลัพธ์ที่ได้จะตรงเป๊ะ เหมือนกัน

    รูปแบบ 2 : (?<=\[)(.*?)(?=\])

    โปรดทราบว่ากลุ่มจับภาพของเรา (.*?) ดำเนินการ การค้นหาแบบขี้เกียจ สำหรับข้อความระหว่างสองวงเล็บ - จากอันแรก [ ถึงอันแรก ] กลุ่มการบันทึกที่ไม่มีเครื่องหมายคำถาม (.*) จะทำ การค้นหาอย่างละโมบ และจับทุกอย่างตั้งแต่ [ ไปจนถึงรายการสุดท้าย ] แรก

    ด้วยรูปแบบใน A2 สูตรจะเป็นดังนี้ ดังนี้:

    =AblebitsRegexExtract(A5, $A$2)

    วิธีรับการจับคู่ทั้งหมด

    ตามที่กล่าวไว้แล้ว ฟังก์ชัน AblebitsRegexExtract สามารถแยกการจับคู่ได้เพียงหนึ่งรายการเท่านั้น หากต้องการจับคู่ทั้งหมด คุณสามารถใช้ฟังก์ชัน VBA ที่เรากล่าวถึงก่อนหน้านี้ อย่างไรก็ตาม มีข้อแม้ประการหนึ่ง - VBA RegExp ไม่รองรับการจับภาพกลุ่ม ดังนั้นรูปแบบด้านบนจะส่งกลับอักขระ "ขอบเขต" เช่นกัน วงเล็บในกรณีของเรา

    =TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))

    หากต้องการกำจัด ในวงเล็บ ให้แทนที่ด้วยสตริงว่าง ("") โดยใช้สูตรนี้:

    =SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")

    เพื่อให้อ่านง่ายยิ่งขึ้น เราใช้เครื่องหมายจุลภาคเป็นตัวคั่น

    Regex เพื่อแยกข้อความระหว่างสองสตริง

    วิธีการที่เราได้ผลตีความตามตัวอักษร).

  • (?:[A-Za-z\d\-\.]{2,255}\.)? - กลุ่มที่ไม่จับภาพเพื่อระบุโดเมนระดับที่สาม ระดับที่สี่ ฯลฯ หากมี ( มือถือ ใน URL ตัวอย่างของเรา) ในรูปแบบแรก จะถูกวางไว้ภายในกลุ่มการบันทึกที่ใหญ่กว่าเพื่อให้รวมโดเมนย่อยดังกล่าวทั้งหมดในการแยกข้อมูล โดเมนย่อยสามารถมีความยาวได้ตั้งแต่ 2 ถึง 255 อักขระ ดังนั้น {2,255} quantifier.
  • ([A-Za-z\d\-]{1,63}\.[A-Za-z] {2,24}) - จับกลุ่มเพื่อแยกโดเมนระดับที่สอง ( ablebits ) และโดเมนระดับบนสุด ( com ) ความยาวสูงสุดของโดเมนระดับที่สองคือ 63 อักขระ โดเมนระดับบนสุดที่ยาวที่สุดในปัจจุบันประกอบด้วยอักขระ 24 ตัว
  • ขึ้นอยู่กับนิพจน์ทั่วไปที่ป้อนใน A2 สูตรด้านล่างจะให้ผลลัพธ์ที่แตกต่างกัน:

    =AblebitsRegexExtract(A5, $A$2)

    Regex เพื่อแยก ชื่อโดเมนแบบเต็ม พร้อมโดเมนย่อยทั้งหมด:

    Regex เพื่อแยก ระดับที่สอง โดเมน โดยไม่มีโดเมนย่อย:

    นั่นคือวิธีแยกส่วนของข้อความใน Excel โดยใช้นิพจน์ทั่วไป ฉันขอขอบคุณสำหรับการอ่านและหวังว่าจะได้พบคุณในบล็อกของเราในสัปดาห์หน้า!

    ดาวน์โหลดได้

    ตัวอย่าง Excel Regex Extract (ไฟล์ .xlsm)

    Ultimate Suite รุ่นทดลอง (ไฟล์ .exe)

    \b(0?[0-9]match.Count - 1 text_matches(matches_index, 0) = match.Item(match_index) Next match_index RegExpExtract = text_match อื่นๆ RegExpExtract = match.Item(instance_num - 1) End If End If Exit Function ErrHandl: RegExpExtract = CVErr(xlErrValue) End Function

    หากคุณมีประสบการณ์น้อยเกี่ยวกับ VBA คู่มือผู้ใช้แบบทีละขั้นตอนอาจเป็นประโยชน์: วิธีแทรกโค้ด VBA ใน Excel

    หมายเหตุ เพื่อให้ฟังก์ชันทำงานได้ อย่าลืมบันทึกไฟล์ของคุณเป็น เวิร์กบุ๊กที่เปิดใช้งานมาโคร (.xlsm)

    ไวยากรณ์ RegExpExtract

    ฟังก์ชัน RegExpExtract ค้นหาสตริงอินพุตสำหรับค่าที่ตรงกับนิพจน์ทั่วไป และแยกข้อมูลที่ตรงกันหนึ่งรายการหรือทั้งหมด

    ฟังก์ชันมีไวยากรณ์ต่อไปนี้ :

    RegExpExtract(ข้อความ, รูปแบบ, [instance_num], [match_case])

    ที่ไหน:

    • ข้อความ (จำเป็น) - สตริงข้อความที่จะค้นหา
    • รูปแบบ (จำเป็น) - นิพจน์ทั่วไปที่จะจับคู่ เมื่อระบุโดยตรงในสูตร รูปแบบควรอยู่ในเครื่องหมายอัญประกาศคู่
    • Instance_num (ไม่บังคับ) - หมายเลขซีเรียลที่ระบุอินสแตนซ์ที่จะแยก หากละเว้น จะส่งคืนการจับคู่ที่พบทั้งหมด (ค่าเริ่มต้น)
    • Match_case (ไม่บังคับ) - กำหนดว่าจะจับคู่หรือละเว้นตัวพิมพ์ข้อความ หากเป็น TRUE หรือละเว้น (ค่าเริ่มต้น) จะทำการจับคู่ตามตัวพิมพ์เล็กและใหญ่ ถ้า FALSE - คำนึงถึงตัวพิมพ์เล็กและใหญ่

    ฟังก์ชันนี้ทำงานใน Excel 365, Excel 2021, Excel ทุกรุ่น2019, Excel 2016, Excel 2013 และ Excel 2010

    4 สิ่งที่คุณควรทราบเกี่ยวกับ RegExpExtract

    เพื่อให้ใช้ฟังก์ชันใน Excel ได้อย่างมีประสิทธิภาพ มีสิ่งสำคัญบางประการที่ต้องสังเกต:

    1. ตามค่าเริ่มต้น ฟังก์ชันจะส่งกลับ รายการที่ตรงกันทั้งหมดที่พบ ไปยังเซลล์ข้างเคียงตามที่แสดงในตัวอย่างนี้ ในการรับเหตุการณ์เฉพาะ ให้ระบุตัวเลขที่สอดคล้องกับอาร์กิวเมนต์ instance_num
    2. โดยค่าเริ่มต้น ฟังก์ชันจะ คำนึงถึงตัวพิมพ์เล็กและใหญ่ สำหรับการจับคู่ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ให้ตั้งค่าอาร์กิวเมนต์ match_case เป็น FALSE เนื่องจากข้อจำกัดของ VBA โครงสร้างที่ไม่คำนึงถึงขนาดตัวพิมพ์ (?i) จะไม่ทำงาน
    3. หาก รูปแบบที่ถูกต้องไม่พบ ฟังก์ชันจะไม่ส่งคืนสิ่งใด (สตริงว่าง)
    4. หาก รูปแบบไม่ถูกต้อง จะแสดงเป็น #VALUE! เกิดข้อผิดพลาดขึ้น

    ก่อนที่คุณจะเริ่มใช้ฟังก์ชันแบบกำหนดเองนี้ในเวิร์กชีตของคุณ คุณต้องเข้าใจว่าฟังก์ชันนี้ทำอะไรได้บ้างใช่ไหม ตัวอย่างด้านล่างครอบคลุมกรณีการใช้งานทั่วไปบางกรณี และอธิบายว่าเหตุใดลักษณะการทำงานอาจแตกต่างกันใน Dynamic Array Excel (Microsoft 365 และ Excel 2021) และ Excel แบบเดิม (เวอร์ชัน 2019 และเก่ากว่า)

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

    Regex เพื่อแยกตัวเลขออกจากสตริง

    ตามหลักการพื้นฐานของการสอน "จากง่ายไปซับซ้อน" เราจะเริ่มต้นด้วยกรณีที่ธรรมดามาก: แยกตัวเลขจากสตริง

    The สิ่งแรกที่คุณต้องตัดสินใจคือว่าจะดึงหมายเลขใด: หมายเลขแรก หมายเลขสุดท้าย หมายเลขเฉพาะ หรือหมายเลขทั้งหมด

    แยกหมายเลขแรก

    วิธีนี้ง่ายเหมือน regex เนื่องจาก \d หมายถึงตัวเลขใดๆ ตั้งแต่ 0 ถึง 9 และ + หมายถึงหนึ่งครั้งหรือมากกว่า นิพจน์ทั่วไปของเราจะอยู่ในรูปแบบนี้:

    รูปแบบ : \d+

    Set instance_num เป็น 1 และคุณจะได้ผลลัพธ์ที่ต้องการ:

    =RegExpExtract(A5, "\d+", 1)

    โดยที่ A5 เป็นสตริงต้นฉบับ

    เพื่อความสะดวก คุณสามารถป้อน รูปแบบในเซลล์ที่กำหนดไว้ล่วงหน้า ($A$2 ) และล็อคที่อยู่ด้วยเครื่องหมาย $:

    =RegExpExtract(A5, $A$2, 1)

    รับหมายเลขสุดท้าย

    เพื่อแยกหมายเลขสุดท้ายในสตริง นี่คือรูปแบบที่จะใช้:

    รูปแบบ : (\d+)(?!.*\d)

    แปลเป็นภาษามนุษย์ มันบอกว่า: ค้นหาหมายเลขที่ไม่ได้ติดตาม (ทุกที่ ไม่ใช่ทันที) ด้วยหมายเลขอื่น ในการแสดงสิ่งนี้ เรากำลังใช้ lookahead เชิงลบ (?!.*\d) ซึ่งหมายความว่าทางด้านขวาของรูปแบบไม่ควรมีตัวเลขอื่น (\d) โดยไม่คำนึงว่าจะมีอักขระอื่นอีกกี่ตัวที่อยู่ข้างหน้า<3

    =RegExpExtract(A5, "(\d+)(?!.*\d)")

    เคล็ดลับ:

    • หากต้องการรับ เหตุการณ์เฉพาะ ให้ใช้ \d+ สำหรับ รูปแบบ และซีเรียลที่เหมาะสมจำนวนสำหรับ instance_num .
    • สูตรในการแยก ตัวเลขทั้งหมด จะกล่าวถึงในตัวอย่างถัดไป

    Regex เพื่อแยกข้อมูลที่ตรงกันทั้งหมด

    ผลักดันตัวอย่างของเราให้ลึกลงไปอีกเล็กน้อย สมมติว่าคุณต้องการรับตัวเลขทั้งหมดจากสตริง ไม่ใช่เพียงหนึ่งเดียว

    อย่างที่คุณทราบ จำนวนการจับคู่ที่แยกออกมาจะถูกควบคุมโดยทางเลือก instance_num อาร์กิวเมนต์ ค่าเริ่มต้นคือค่าที่ตรงกันทั้งหมด คุณจึงละเว้นพารามิเตอร์นี้:

    =RegExpExtract(A2, "\d+")

    สูตรทำงานได้อย่างสวยงามสำหรับเซลล์เดียว แต่ลักษณะการทำงานจะแตกต่างกันใน Dynamic Array Excel และเวอร์ชันที่ไม่ใช่ไดนามิก

    Excel 365 และ Excel 2021

    เนื่องจากการรองรับอาร์เรย์แบบไดนามิก สูตรปกติจะขยายไปยังเซลล์จำนวนมากโดยอัตโนมัติตามต้องการเพื่อแสดงผลการคำนวณทั้งหมด ในแง่ของ Excel นี่เรียกว่าช่วงที่มีการรั่วไหล:

    Excel 2019 และต่ำกว่า

    ใน Excel แบบพรีไดนามิก สูตรด้านบนจะแสดงค่าที่ตรงกันเพียงค่าเดียว หากต้องการจับคู่หลายรายการ คุณต้องทำให้เป็นสูตรอาร์เรย์ สำหรับสิ่งนี้ ให้เลือกช่วงของเซลล์ พิมพ์สูตร แล้วกด Ctrl + Shift + Enter เพื่อทำให้สมบูรณ์

    ข้อเสียของวิธีนี้คือข้อผิดพลาด #N/A จำนวนมากที่ปรากฏใน "เซลล์พิเศษ" . น่าเสียใจที่ไม่สามารถทำอะไรได้เลย (ทั้ง IFERROR และ IFNA ไม่สามารถแก้ไขได้ อนิจจา)

    แยกข้อมูลที่ตรงกันทั้งหมดในเซลล์เดียว

    เมื่อประมวลผลคอลัมน์ของข้อมูล เห็นได้ชัดว่าวิธีการข้างต้นใช้ไม่ได้ผล ในกรณีนี้เป็นทางออกที่ดีจะส่งคืนการแข่งขันทั้งหมดในเซลล์เดียว ในการดำเนินการ ให้แสดงผลลัพธ์ของ RegExpExtract ไปยังฟังก์ชัน TEXTJOIN และคั่นด้วยตัวคั่นที่คุณต้องการ พูดเครื่องหมายจุลภาคและเว้นวรรค:

    =TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))

    หมายเหตุ เนื่องจากฟังก์ชัน TEXTJOIN พร้อมใช้งานใน Excel สำหรับ Microsoft 365, Excel 2021 และ Excel 2019 เท่านั้น สูตรจึงใช้ไม่ได้ในเวอร์ชันเก่า

    Regex เพื่อแยกข้อความจากสตริง

    แยกข้อความจาก สตริงที่เป็นตัวอักษรและตัวเลขเป็นงานที่ค่อนข้างท้าทายใน Excel ด้วย regex มันจะกลายเป็นเรื่องง่ายเหมือนพาย เพียงใช้คลาสที่ไม่มีค่าเพื่อจับคู่ทุกอย่างที่ไม่ใช่ตัวเลข

    รูปแบบ : [^\d]+

    เพื่อรับสตริงย่อยในแต่ละเซลล์ (ช่วงการรั่วไหล) สูตรคือ:

    =RegExpExtract(A5, "[^\d]+")

    หากต้องการส่งออกข้อมูลที่ตรงกันทั้งหมดลงในเซลล์เดียว ให้ซ้อนฟังก์ชัน RegExpExtract ใน TEXTJOIN ดังนี้:

    =TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))

    Regex เป็น แยกที่อยู่อีเมลจากสตริง

    หากต้องการดึงที่อยู่อีเมลจากสตริงที่มีข้อมูลต่างๆ จำนวนมาก ให้เขียนนิพจน์ทั่วไปที่จำลองโครงสร้างที่อยู่อีเมล

    รูปแบบ : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}

    การแจกแจง regex นี้ นี่คือสิ่งที่เราได้รับ:

    • [\w\.\-]+ คือชื่อผู้ใช้ที่อาจมีอักขระที่เป็นตัวอักษรและตัวเลขคละกัน เครื่องหมายขีดล่าง จุด และขีดกลางตั้งแต่ 1 ตัวขึ้นไป
    • สัญลักษณ์ @
    • [A-Za-z0-9\.\-]+ เป็นชื่อโดเมนที่ประกอบด้วย: ตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ตัวเลข ยัติภังค์ และจุด (ในกรณีที่ของโดเมนย่อย) ไม่อนุญาตให้ใช้ขีดล่างที่นี่ ดังนั้นจึงใช้ชุดอักขระ 3 ชุดที่แตกต่างกัน (เช่น A-Z a-z และ 0-9) แทน \w ที่ตรงกับตัวอักษร ตัวเลข หรือขีดล่าง
    • \.[A-Za-z ]{2,24} เป็นโดเมนระดับบนสุด ประกอบด้วยจุดตามด้วยตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก โดเมนระดับบนสุดส่วนใหญ่มีความยาว 3 ตัวอักษร (เช่น .com .org, .edu เป็นต้น) แต่ตามทฤษฎีแล้วสามารถมีได้ตั้งแต่ 2 ถึง 24 ตัวอักษร (TLD ที่จดทะเบียนแล้วยาวที่สุด)

    สมมติว่าสตริงอยู่ใน A5 และรูปแบบใน A2 สูตรในการแยกที่อยู่อีเมลคือ:

    =RegExpExtract(A5, $A$2)

    Regex เพื่อแยกโดเมนจากอีเมล

    เมื่อ มาถึงการแยกโดเมนอีเมล ความคิดแรกที่นึกถึงคือการใช้กลุ่มจับภาพเพื่อค้นหาข้อความที่ตามหลังอักขระ @ ทันที

    รูปแบบ : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})

    ส่งไปยังฟังก์ชัน RegExp ของเรา:

    =RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")

    และ คุณจะได้ผลลัพธ์นี้:

    เมื่อใช้นิพจน์ทั่วไปแบบคลาสสิก สิ่งที่อยู่นอกกลุ่มการจับภาพจะไม่รวมอยู่ในการแยก ไม่มีใครรู้ว่าเหตุใด VBA RegEx จึงทำงานต่างกันและจับ "@" ด้วย ในการกำจัด คุณสามารถลบอักขระตัวแรกออกจากผลลัพธ์โดยแทนที่ด้วยสตริงว่าง

    =REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")

    นิพจน์ปกติเพื่อแยกหมายเลขโทรศัพท์

    หมายเลขโทรศัพท์ สามารถเขียนได้หลายวิธี ซึ่งเป็นเหตุผลว่าทำไมจึงเป็นไปไม่ได้เลยที่จะคิดวิธีแก้ปัญหาที่ทำงานภายใต้ทั้งหมด(\d{4}จากสตริง

    นิพจน์ทั่วไปสำหรับการแยกวันที่ขึ้นอยู่กับรูปแบบที่วันที่ปรากฏในสตริง ตัวอย่างเช่น:

    หากต้องการแยกวันที่ เช่น 1/1/21 หรือ 01/01/2021 regex คือ: \d{1,2}\/\d{1,2}\/(\d {4}สถานการณ์. อย่างไรก็ตาม คุณสามารถจดรูปแบบทั้งหมดที่ใช้ในชุดข้อมูลของคุณและพยายามจับคู่รูปแบบเหล่านั้น

    สำหรับตัวอย่างนี้ เราจะสร้าง regex ที่จะแยกหมายเลขโทรศัพท์ในรูปแบบใดๆ ต่อไปนี้:

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123- 345-6789

    123.345.6789

    123 345 6789

    1233456789

    รูปแบบ : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b

    • ส่วนแรก \(?\d{3} จับคู่ศูนย์หรือหนึ่งวงเล็บเปิดตามด้วยตัวเลขสามหลัก d{3}
    • ส่วน [-\. \)]* หมายถึงอักขระใดๆ ในวงเล็บเหลี่ยมที่ปรากฏตั้งแต่ 0 ครั้งขึ้นไป: ยัติภังค์ จุด เว้นวรรค หรือวงเล็บปิด
    • ต่อไป เรามีตัวเลขสามหลักอีกครั้ง d{3} ตามด้วย ยัติภังค์ จุด หรือเว้นวรรค [-\ ]? ปรากฏ 0 หรือ 1 ครั้ง
    • หลังจากนั้นจะมีกลุ่มตัวเลขสี่หลัก \d{4}.
    • สุดท้าย มีขอบเขตของคำ \b ที่กำหนดหมายเลขโทรศัพท์ของเรา การค้นหาไม่สามารถเป็นส่วนหนึ่งของจำนวนที่มากกว่าได้

    สูตรที่สมบูรณ์จะใช้รูปแบบนี้:

    =RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")

    โปรดทราบว่า regex ด้านบนอาจคืนค่าไม่กี่ ผลลัพธ์ที่เป็นเท็จ เช่น 123) 456 7899 หรือ (123 456 7899 เวอร์ชันด้านล่างแก้ไขปัญหาเหล่านี้ได้ อย่างไรก็ตาม ไวยากรณ์นี้ใช้ได้เฉพาะในฟังก์ชัน VBA RegExp ไม่ใช่ในนิพจน์ทั่วไปแบบคลาสสิก

    รูปแบบ : (\(\d{3}\)out สำหรับการดึงข้อความระหว่างสองอักขระออกมาก็จะทำงานสำหรับการแยกข้อความระหว่างสองสตริงด้วยเช่นกัน

    ตัวอย่างเช่น หากต้องการรับทุกอย่างระหว่าง "test 1" และ "test 2" ให้ใช้นิพจน์ทั่วไปต่อไปนี้

    รูปแบบ : ทดสอบ 1(.*?)ทดสอบ 2

    สูตรที่สมบูรณ์คือ:

    =AblebitsRegexExtract(A5, "test 1(.*?)test 2")

    Regex เพื่อแยกโดเมนจาก URL

    แม้จะใช้นิพจน์ทั่วไป การแยกชื่อโดเมนออกจาก URL ก็ไม่ใช่เรื่องเล็กน้อย องค์ประกอบสำคัญที่ทำเคล็ดลับคือกลุ่มที่ไม่จับภาพ ขึ้นอยู่กับเป้าหมายสูงสุดของคุณ เลือกหนึ่งใน regexes ด้านล่าง

    หากต้องการรับ ชื่อโดเมนแบบเต็ม รวมถึงโดเมนย่อย

    รูปแบบ : (?: https?\:

    Michael Brown เป็นผู้ที่ชื่นชอบเทคโนโลยีโดยเฉพาะและมีความหลงใหลในการทำให้กระบวนการที่ซับซ้อนง่ายขึ้นโดยใช้เครื่องมือซอฟต์แวร์ ด้วยประสบการณ์กว่าทศวรรษในอุตสาหกรรมเทคโนโลยี เขาได้ฝึกฝนทักษะของเขาใน Microsoft Excel และ Outlook รวมถึง Google ชีตและเอกสาร บล็อกของ Michael ทุ่มเทให้กับการแบ่งปันความรู้และความเชี่ยวชาญของเขากับผู้อื่น โดยให้คำแนะนำและแบบฝึกหัดที่ทำตามได้ง่ายเพื่อปรับปรุงผลิตภาพและประสิทธิภาพ ไม่ว่าคุณจะเป็นมืออาชีพที่ช่ำชองหรือมือใหม่ บล็อกของ Michael นำเสนอข้อมูลเชิงลึกอันมีค่าและคำแนะนำที่เป็นประโยชน์สำหรับการใช้ประโยชน์สูงสุดจากเครื่องมือซอฟต์แวร์ที่จำเป็นเหล่านี้