Regular expression กับภาษาไทย

วันศุกร์กำลังนั่งทำงานอยู่ แล้วก็คิดไปคิดมาว่าสิ่งที่ต้องทำคือการตรวจสอบว่า ข้อความที่ส่งเข้ามานี่มีตัวอักษรประหลาดพวก *^#$… อะไรพวกนี้อยู่หรือป่าว ปกติก็ลองกับภาษาอังกฤษธรรมดา เวลาใช้ regular expression ตรวจก็จะมีรูปแบบประมาณว่า

\w
ซึ่งเหมือนกันทุกภาษา แต่พอใช้ภาษาไทยปรากฏว่ามันตรวจสอบโดยใช้รูปแบบด้านบนไม่ได้นี่สิ เลยต้องขุดเพิ่มเติมนิดหน่อยแล้วก็เจอตัวนี้เข้า
\p{...}
รูปแบบนี้เป็นตัวบอกว่าจะใช้กลุ่มรูปแบบที่เกี่ยวกับ unicode นะ คราวนี้ถ้าต้องการตรวจสอบภาษาไทยก็ใส่เป็น
\p{L}
แต่ปัญหามันไม่จบแค่นั้น ถ้าใส่แค่ L มันจะเอาเฉพาะที่เป็นพยัญชนะ พวก สระ และ วรรณยุกต์ ถ้าเจอมันจะบอกว่าผิดรูปแบบทันที แต่คำภาษาไทยมันรวมพวกนั้นเข้าไปด้วยหนะสิ ก็เลยต้องแก้รูปแบบอีกทีเป็น
[\p{L}\p{M}]
โดย M ที่ใส่มาก็เพื่อบอกว่าเอา สระ และ วรรณยุกต์ด้วยนั่นเอง สำหรับรายละเอียดเพิ่มเติมอ่านได้จากเว็บนี้ http://unicode.org/unicode/reports/tr18/ จะมีพวกตัวอักษรตัวเล็ก ตัวใหญ่ … อีกมากมายในภาษาอื่นๆ ด้วยลองไปดูเอาละกันครับ

นอกเรื่อง: ส่วนนี้พูดถึง serialize ของจาวาหน่อย เพราะวันศุกร์ไปปล่อยความงี่เง่าส่วนตัวใส่เพื่อนแหะๆ ปกติเวลา serialize วัตถุอะไรในจาวาก็จะให้คลาสของ วัตถุนั้น implements Serializable แต่ถ้าเกิด คลาสนั้น สืบทอด ต่อมาจากคลาสอื่นที่ไม่ serialize หละ ตัวแปรในคลาสอื่นที่ต้องเก็บไปด้วยจะเกิดอะไรขึ้น ลองดูตัวอย่างจากโค้ดด้านล่างดู


class Vehicle {
  protected int speed;
  ... another abstract method
}

class Car extends Vehicle implements Serializable { private int doors; ... setter/getter method }

public class Main { public static void main(String... args) throws Exception { Car car = new Car(); car.setSpeed(100); car.setDoor(2); ... another car method

FileOutputStream fos = new FileOutputStream("object.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(car);
oos.close();
fos.close();

Car car2;
FileInputStream fis = new FileInputStream("object.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
car2 = ois.readObject();
ois.close();
fis.close();

System.out.println(car2.getSpeed()); // Null pointer exception? หรือ 0
System.out.println(car2.getDoor());
...

} }

Tags: , , ,

Post Author

This post was written by llun who has written 511 posts on แนท (/næt/).

I'm programmer at Throughwave

Trackbacks/Pingbacks

  1. Flex RegExpValidator - แนท - June 23, 2008

    [...] regular expression ใหม่ จากของเดิมสมัยจาวาเวลาจะ validate string อะไรก็ตามจะใช้ [p{L}p{M}]+ [...]

Leave a Reply