search replace แบบฉลาด โดย regular expression ใน notepad++

search replace แบบฉลาด โดย regular expression ใน notepad++

ปัญหานี้ เกิดขึ้นกับผมบ่อยมาก สำหรับกรณีที่มี text ต้องแปลง, ต้องตัด, ต้องเพิ่ม จำนวนมากๆ ชนิดว่า ตั้งแต่หลายๆร้อยขึ้นไป จนเป็นล้านๆก็มี ถ้าจะมานั่งทำทีละ 10 ก็เหนื่อตายก่อนพอดี ปัญหามันอยู่ตรงที่ text ต้นฉบับ ถ้ามันเหมือนกันหมดก็ง่าย เพราะว่า ใช้ search and replace เข้าไปได้เลย แต่ว่าหลายครั้งมันเป็นกรณีที่ text หน้าตาไม่เหมือนกัน แต่มี pattern เหมือนกัน ตัวอย่างเช่น

วันหนึ่งสาวสวยเสื้อขาวเดินทางท่องเที่ยวทั่วไทย วันหนึ่งสาวสวยเสื้อเขียวเดินทางท่องเที่ยวทั่วลาว วันหนึ่งสาวสวยเสื้อม่วงเดินทางท่องเที่ยวทั่วกัมพูชา

จะเห็นว่า สีเสื้อ กับ ชื่อประเทศ เปลี่ยนไปในแต่ละบรรทัด ถ้าโจทย์ของผมต้องการ ลบสีเสื้อออก และเปลี่ยนชื่อประเทศทั้งหมด ให้เป็น เวียดนาม ให้กลายเป็น วันหนึ่งสาวสวยเดินทางท่องเที่ยวทั่วเวียดนาม ทั้งหมด (อันนี้เป็นโจทย์ตัวอย่างเพื่อให้ฝึกทักษะเท่านั้นนะครับ) คำถามคือ คุณจะทำอย่างไรครับ?

ถ้าเป็นแบบ ถึกๆ เหมือนผมเมื่อก่อน เรื่องถึกเนี่ยถนัดนัก 5555 ก็คือ search replace ทีละจุดครับ เดี๋ยวก็เสร็จ เหอๆๆๆ แต่ว่า โจทย์นี้ง่าย เพราะว่ามี 3 บรรทัดเท่านั้น ถ้าเป็น หมื่น บรรทัดล่ะ? บางคนอาจจะฉลาดหน่อย โดยหา pattern สีทั้งหมดก่อน (อ่านและสังเกตุ) จากนั้น ก็ค่อยๆ search replace ทีละสี ก็ครบ มี 12 สีก็ทำ 12 รอบ ส่วนการเปลี่ยนชื่อประเทศ ก็ทำคล้ายกัน คือ search replace ไปทีละประเทศ ไม่นานก็เสร็จ ไม่ต้องทำทีละบรรทัด

แต่ว่า เราขอเสนอวิธีที่ฉลาดล้ำกว่านั้น คือ search replace รอบเดียวเสร็จเลย ด้วยการเอา regular expression เข้ามาใช้เป็นเงื่อนไขในการค้นหา กับเครื่องมือง่ายๆ นั่นคือ โปรแกรม notepad++ โปรแกรมนี้ เป็น text editor ที่เป็น freeware, open source ด้วยครับ โหลดมาใช้ได้ง่ายๆ สบายๆเลย และมีเครื่องมือที่ฉลาดอีกหลายๆอย่างคอยช่วยเหลืองานเราด้วย สำหรับผม โปรแกรม text editor ในเครื่องตอนนี้ จะมี Notepad2 , Notepad++ , Netbean เท่านี้ครับ เหลือเฟือละ

กลับมาเข้าเรื่องจากโจทย์เรา จะเห็นว่า สีต่างๆ นั้นมันอยู่ตรงกลางประโยค เราก็ทำ search replace ได้โดยใส่ช่อง search ดังนี้ครับ

วันหนึ่งสาวสวยเสื้อ.*?เดินทางท่องเที่ยวทั่ว(|\.)

จะเห็นว่า ไม่มีชื่อประเทศ และชื่อสี ถูกเปลี่ยนเป็น .*? (dot, star, question mark) รวมทั้ง ช่อง search and replace ต้องติ้กเลือกด้านล่าง ว่า Regular Expression อีกด้วย เพื่อทำให้ทำงานค้นหาแบบ regular expression ได้ สำหรับช่อง replace ก็คือ จะให้เปลี่ยนเป็นอะไร เราก็ใส่แค่ "วันหนึ่งสาวสวยเดินทางท่องเที่ยวทั่ว" เท่านั้น (ไม่มีเครื่องหมาย quote นะครับ) เพราะว่าเราต้องการลบสีเสื้อออก

notepad ++ search regular expression

เมื่อเรากด Replace All ป้าบเข้าไป ก็จะแปลงร่างเป็น 

วันหนึ่งสาวสวยเดินทางท่องเที่ยวทั่วไทย วันหนึ่งสาวสวยเดินทางท่องเที่ยวทั่วลาว วันหนึ่งสาวสวยเดินทางท่องเที่ยวทั่วกัมพูชา

นั่นก็คือ ตรงไหนที่เป็นจุดเปลี่ยนใน pattern นั้นให้เราแทนด้วย .*? และปิดท้ายจุดที่เป็น pattern นั้นด้วย (|\.) ก็จะทำให้สามารถ search ได้ตลอด pattern นี้

จากนั้นเรายังเหลือการเปลี่ยนชื่อหลายๆประเทศเป็น เวียดนาม ด้วยความรู้เดียวกัน เราจะเขียน pattern ในช่อง search ได้ด้วย

วันหนึ่งสาวสวยเดินทางท่องเที่ยวทั่ว.*(|\.)

และช่อง replace ด้วย

วันหนึ่งสาวสวยเดินทางท่องเที่ยวทั่วเวียดนาม 

ก็เป็นอันใช้ได้ครับ สำหรับสาเหตุที่ dot star แล้สไม่ตามด้วย question mark นั้น เป็นเพราะว่า เราไม่ต้องการให้เหลือ text ข้างหลังของ "ทั่ว" เพราะเราจะ replace เป็น "ทั่วเวียดนาม"

ย้ำอีกทีนะครับ เพราะว่านี่เป็นโจทย์ฝึกทักษะเท่านั้น ไม่ใช่งานจริง เพราะว่าถ้าเป็นงานจริง การ replace แล้วผลลัพท์สุดท้ายเหมือนกันทุกบรรทัดคงไม่ใช่ครับ

ลองใช้เครื่องมือเหล่านี้ให้ถนัด แล้วเวลาที่เจองานที่ต้องแปลง text เยอะๆ แบบฉลาด จะได้คล่องๆครับ 

จริงๆ งานแบบนี้เมื่อก่อน ผมเอาเข้า database แล้วเขียน php ประมวลผลออกมาเลยล่ะ 5555 โหด ถึก กว่านี้เยอะ

ป.ล. เราสามารถยุบรวมเงื่อนไข ให้เหลือการทำงานแค่รอบเดียวได้โดยใช้ เงื่อนไขการ search วันหนึ่งสาวสวย.*?เดินทางท่องเที่ยวทั่ว.*(|\.)

Create: Modify : 2013-04-10 16:57:45 Read : 4941 URL :