มาเสริมพลังให้กับ Find & Replace ด้วย Regex กันดีกว่า

Piyakorn Jansiripitikul
True e-Logistics
2 min readMay 26, 2019

--

เมื่อไม่นานมานี้ มีเหตุจำเป็นให้ต้องแก้ไฟล์ข้อมูลที่มี pattern ซ้ำๆกัน ด้วยความขี้เกียจ เราก็เลยลองหาวิธีที่จะทำให้เราต้องทำการแก้ข้อมูลตัวนี้ได้ง่ายที่สุด โดยไม่ต้องทำทีละบรรทัดซ้ำๆจนจบไฟล์ หาข้อมูลไปพักนึง…และแล้วก็บิงโก!!! ปัญหาของเราสามารถ Solve ได้ด้วยการใช้ Regex หรือ Regular Expression นั่นเองจ้า​

มาเกริ่นกันก่อน Regex คืออะไร ?

Regex คือ การกำหนดรูปแบบหรือกลุ่มคำ เพื่อเอาไว้ใช้ค้นหา, แก้ไข, จัดการข้อความต่างๆตามที่เราต้องการ
ถ้าใครยังนึกภาพไม่ออก ให้นึกถึงการใช้ Ctrl + F เพราะนั่นก็คือการใช้หลักการของ Regex อย่างหนึ่ง

ยกตัวอย่างการใช้งานใน VScode ค้นหาคำว่า male

เชื่อว่าทุกคนคงคุ้นเคยกับการใช้ Ctrl + F ตามแบบภาพข้างต้นนี้ เป็นอย่างดี

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

ใครที่ยังไม่ค่อยคุ้นกับการใช้ Regex หรือต้องการศึกษาเพิ่มเติม สามารถตามไปอ่านที่บทความเหล่านี้ได้เลยนะ

https://devahoy.com/blog/2016/11/regular-expressions-101/
https://itnext.io/regular-expressions-tricks-you-should-know-2976c7bd1be3

เกริ่นกันมาพอแล้ว มาดูกันเลย!!

เรามีข้อความตั้งต้นแบบนี้ (สมมติว่าตัดมาส่วนหนึ่งจากไฟล์ 1000+ บรรทัด)

บังเอิญว่าเราต้องการจะแก้ format ในส่วนของวันที่ จาก YYYYMMDD ให้เป็น DD/MM/YYYY ตามปกติแล้ว เราอาจจะค่อยๆแก้ไปทีละบรรทัด ถ้าข้อมูลขนาดไม่ใหญ่มาก หรือใครขยันหน่อยก็เขียนโค้ดแปลงข้อมูลเองเลย

แต่วิธีที่เราจะเสนอในวันนี้ ง่ายกว่านั้น พิมพ์แค่สองบรรทัด บวกอีกคลิ้กเดียว จบ!!

เริ่มด้วยเปิดใช้งาน Regex ในช่อง Search กันก่อน

ในที่นี้เราเลือกใช้ VScode ไม่แน่ใจเท่าไหร่ว่า Editor ตัวอื่นๆทำได้เหมือนกันมั๊ยนะ

ต่อไปก็มาดูว่า Regex ที่เราจะใช้ในการจับกลุ่ม และ match ข้อความที่เราจะแก้ไขคืออะไร ซึ่ง Regex ที่เราใช้ในการ match วันที่ในตัวอย่างข้างต้นคือ

/'([0–9]{4})(0[0–9]|1[0–2])([0–2][0–9]|3[0–1])'/g
ผลลัพธ์ที่ได้จากการลอง search ด้วย Regex ใน VScode

เมื่อผลลัพธ์ออกมาเป็นแบบที่เราต้องการคือ match วันที่ทั้งหมดในไฟล์นี้แล้ว เราจะมาแก้ format ให้เป็นไปตามที่เราต้องการกัน

หลายๆคนอาจจะสงสัย แล้วเราจะรู้ได้ยังไงว่าเราจับกลุ่มของ ปี เดือน วัน ได้ถูกต้อง
งั้นลองเอา Regex ของเราไปเช็คกันหน่อย ที่ https://regex101.com

เช็คความถูกต้องของ Regex ว่า เราจับ group ถูกแล้วนะ

จากภาพด้านบน จะบอกรายละเอียดของ Regex ที่เราใช้ว่า match กับข้อความอย่างไร ในส่วนที่เรา group ข้อมูลไว้ ก็จะถูกแสดงไว้อย่างละเอียดทั้งหมด แบ่งสีไฮไลท์ข้อความให้ด้วยนะ ง่อววววววว

เมื่อเช็คเรียบร้อยแล้ว ก็มาถึงขั้นตอนการแก้ไขข้อความกัน Regex ที่เราจะใช้คือ

/'$3/$2/$1'/g

จากภาพข้างบนได้บอกรายละเอียดไว้แล้วว่า
ชุดตัวเลขของ ปี เดือน วัน คือ group 1 2 3 ตามลำดับ
เราสามารถใช้กลุ่มของตัวเลขเหล่านี้ ในช่อง Replace ได้เลย
เพื่อความชัวร์อีกที ลองเอาไปเช็คก่อน

เช็คผลลัพธ์ของการ Replace ด้วย Regex ที่แยกกลุ่มของวันที่ไว้แล้ว

เมื่อเช็คผลลัพธ์ออกมาถูกต้อง ตามที่ต้องการแล้วเราก็นำ Regex ไปใส่ใน ช่อง replace ที่ VScode แล้วกด replace all ได้เลย

เพียงคลิกเดียวเท่านั้น เปลี่ยนข้อความได้ทั้งไฟล์อย่างกับใช้เวทมนตร์ อู้วหูวววววว

ผลลัพธ์หลังจากกด Replace All เปลี่ยน Format วันที่ ได้ทั้งไฟล์

ขอบคุณทุกคนที่อ่านกันมาถึงตรงนี้ หวังว่าจะมีประโยชน์ เป็นแนวทางช่วยให้ทุกคนแก้ไขไฟล์งานขนาดใหญ่ได้ง่ายขึ้นนะฮะ

REF: https://www.hhllcks.de/blog/2017/6/23/regular-expressions-3

--

--