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());
    ...
  }
}


Comments

Add Yours

  • Author Avatar

    YOU


Comment Arrow



About Author

llun

Apple addict programmer