สารบัญ
ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้นิพจน์ทั่วไปใน 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 เวอร์ชันล่าสุดแล้ว การแยกข้อความโดยใช้นิพจน์ทั่วไปจะสรุปเป็นสองขั้นตอนต่อไปนี้:
- บนแท็บ Ablebits Data ในกลุ่ม Text ให้คลิก Regex Tools
- ในบานหน้าต่าง Regex Tools เลือกแหล่งข้อมูล ป้อนรูปแบบ Regex ของคุณ และเลือกตัวเลือก แตกไฟล์ ในการรับผลลัพธ์เป็นฟังก์ชันแบบกำหนดเอง ไม่ใช่ค่า ให้เลือกเครื่องหมายถูก แทรกเป็นสูตร กล่อง. เมื่อเสร็จแล้ว ให้คลิกปุ่ม แตกไฟล์
ผลลัพธ์จะปรากฏในคอลัมน์ใหม่ทางด้านขวาของข้อมูลเดิมของคุณ:
ไวยากรณ์ของ AblebitsRegexExtract
ฟังก์ชันที่กำหนดเองของเรามีรูปแบบดังต่อไปนี้:
AblebitsRegexExtract(reference, Regular_expression)ที่ไหน:
- อ้างอิง (จำเป็น) - การอ้างอิงไปยังเซลล์ที่มีสตริงต้นฉบับ
- Regular_expression (จำเป็น) - รูปแบบ regex ที่ตรงกัน
หมายเหตุสำคัญ! ฟังก์ชันนี้ใช้งานได้กับเครื่องที่ติดตั้ง Ultimate Suite for Excel เท่านั้น
บันทึกการใช้งาน
เพื่อให้ช่วงการเรียนรู้ของคุณราบรื่นขึ้นและประสบการณ์ของคุณสนุกสนานยิ่งขึ้น โปรดใส่ใจกับประเด็นเหล่านี้:
- ในการสร้างสูตร คุณสามารถใช้ เครื่องมือ Regex หรือไดอะล็อก แทรกฟังก์ชัน ของ Excel หรือพิมพ์ชื่อฟังก์ชันแบบเต็มในเซลล์ เมื่อใส่สูตรแล้ว คุณสามารถจัดการ (แก้ไข คัดลอก หรือย้าย) ได้เหมือนกับสูตรทั่วไป
- รูปแบบที่คุณป้อนในบานหน้าต่าง Regex Tools ไปที่อาร์กิวเมนต์ที่ 2 นอกจากนี้ยังสามารถเก็บนิพจน์ทั่วไปไว้ในเซลล์ที่แยกจากกันได้อีกด้วย ในกรณีนี้ เพียงใช้การอ้างอิงเซลล์สำหรับอาร์กิวเมนต์ที่ 2
- ฟังก์ชันจะแยก การจับคู่ที่พบครั้งแรก
- โดยค่าเริ่มต้น ฟังก์ชันคือ ตัวพิมพ์เล็กและใหญ่ -ไว . สำหรับการจับคู่ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ให้ใช้รูปแบบ (?i)
- หากไม่พบการจับคู่ ข้อผิดพลาด #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 เพื่อแยกข้อความระหว่างสองสตริง
วิธีการที่เราได้ผลตีความตามตัวอักษร).
ขึ้นอยู่กับนิพจน์ทั่วไปที่ป้อนใน 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 ได้อย่างมีประสิทธิภาพ มีสิ่งสำคัญบางประการที่ต้องสังเกต:
- ตามค่าเริ่มต้น ฟังก์ชันจะส่งกลับ รายการที่ตรงกันทั้งหมดที่พบ ไปยังเซลล์ข้างเคียงตามที่แสดงในตัวอย่างนี้ ในการรับเหตุการณ์เฉพาะ ให้ระบุตัวเลขที่สอดคล้องกับอาร์กิวเมนต์ instance_num
- โดยค่าเริ่มต้น ฟังก์ชันจะ คำนึงถึงตัวพิมพ์เล็กและใหญ่ สำหรับการจับคู่ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ให้ตั้งค่าอาร์กิวเมนต์ match_case เป็น FALSE เนื่องจากข้อจำกัดของ VBA โครงสร้างที่ไม่คำนึงถึงขนาดตัวพิมพ์ (?i) จะไม่ทำงาน
- หาก รูปแบบที่ถูกต้องไม่พบ ฟังก์ชันจะไม่ส่งคืนสิ่งใด (สตริงว่าง)
- หาก รูปแบบไม่ถูกต้อง จะแสดงเป็น #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?\: