Regex tiếng Việt có dấu Java

  • #1

Bạn ơi mình có đoạn code sau:

PHP:

if(s.matches("^[a-z A-Z]{1,50}$"))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }

Đoạn code của mình là để kiểm tra tên nhập vào. Nhưng mình chỉ kiểm tra được tên nhập vào không dấu.
ví dụ: nhập họ tên :
Nguyen Van A (hàm trên chấp nhận)
Nhập : Nguyễn Văn Á (không chấp nhập)
==> Bạn có thể giúp mình có hàm nào, để kiểm tra dữ liệu cho 2 trường hợp trên đều đúng không ?
Mong các bạn xem giúp mình!!!

Regex tiếng Việt có dấu Java

  • #2

Có 2 cách đơn giản cho bạn

  1. Chuyển về không dấu rồi kiểm tra, tất nhiên là kiểm tra đúng thì đưa cái có dấu vào.
  2. Thêm tất cả các ký tự có dấu của tiếng việt vào trong dãy kiểm tra.

  • #3

Tiếng Việt dùng một só kí tự có dấu nằm trong hệ ANSI (như Á, á, À, à É...)
Các kí tự còn lại:
Các kí tự có dấu của kí tự (Ă, ă, Đ...) nằm rải rác.
Các kí tự có dấu thanh (Ắ, ắ , Ế...) nằm theo một dọc ở khoảng bắt đàu từ 0x1Ea0.
Lâu lâu cũng có VH một số phông chữ không có các kí tự TV nên cũng lấy được thế này:
Font Creator.

Code:

$0102, $0103, $0110, $0111,$0128, $0129, $0168, $0169, $01A0, $01A1, $01AF, $01B0, $1EA0 - $1EF9

Cụ thể:

Code:

Ă - ă: \u0102 - \u0103
Đ - đ: \u0110 - \u0111
Ĩ - ĩ: \u0128 - \u0129
Ũ - ũ: \u0168 - \u0169
Ơ - ơ: \u01A0 - \u01A1
Ư - ư: \u01AF - \u01B0
Ạ - ỹ: \u1EA0 - \u1EF9

Các khoảng phía trên đều là 2 kí tự, trừ Ạ- ỹ bao gồm 102 kí tự TV.
Mình nhớ là có Regex nào đó (C# thì phải) mình để [ĂăĐđĨĩŨũƠơƯưẠ-ỹ] (các kí tự TV nằm ngoài ANSI, các kí tự trong ANSI không thống kê ở đây)

  • #4

Tiếng Việt dùng một só kí tự có dấu nằm trong hệ ANSI (như Á, á, À, à É...)
Các kí tự còn lại:
Các kí tự có dấu của kí tự (Ă, ă, Đ...) nằm rải rác.
Các kí tự có dấu thanh (Ắ, ắ , Ế...) nằm theo một dọc ở khoảng bắt đàu từ 0x1Ea0.
Lâu lâu cũng có VH một số phông chữ không có các kí tự TV nên cũng lấy được thế này:
Font Creator.

Code:

$0102, $0103, $0110, $0111,$0128, $0129, $0168, $0169, $01A0, $01A1, $01AF, $01B0, $1EA0 - $1EF9

Cụ thể:

Code:

Ă - ă: \u0102 - \u0103
Đ - đ: \u0110 - \u0111
Ĩ - ĩ: \u0128 - \u0129
Ũ - ũ: \u0168 - \u0169
Ơ - ơ: \u01A0 - \u01A1
Ư - ư: \u01AF - \u01B0
Ạ - ỹ: \u1EA0 - \u1EF9

Các khoảng phía trên đều là 2 kí tự, trừ Ạ- ỹ bao gồm 102 kí tự TV.
Mình nhớ là có Regex nào đó (C# thì phải) mình để [ĂăĐđĨĩŨũƠơƯưẠ-ỹ] (các kí tự TV nằm ngoài ANSI, các kí tự trong ANSI không thống kê ở đây)

Vậy mình truyền vô như thế này phải không bạn? Sao nó cũng không hiểu nữa

PHP:

if(s.matches("^[a-z Ạ-ỹ A-Z]$"))
                  //  if(s.matches("^[a-z A-Z]{1,50}$"))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }

  • #5

Vậy mình truyền vô như thế này phải không bạn? Sao nó cũng không hiểu nữa

PHP:

if(s.matches("^[a-z Ạ-ỹ A-Z]$"))

Hàm matches có support cho Ạ ... đâu mà truyền vào như thế.

Mà sao cứ máy móc thế nhỉ?!! kiểm tra xem đúng là họ tên ko mà mắc vụ dấu má thì tại sao ko chuyển về dạng. Nếu trong tiên điền vào ko có số, kí tự lạ thì có nghĩa nó là tên....

  • #6

Tất nhiên là chỉ TV thôi, các ngôn ngữ khác thì nó không được rồi. Lỡ ai đó có đứa con lai Pháp hay Đức gì đó thì nhập mãi mà cứ bảo là sai

Regex tiếng Việt có dấu Java

PHP:

System.out.println("AÁÀẢÃẠÂẤẦẨẪẬĂẮẰẲẴẶEÉÈẺẼẸÊẾỀỂỄỆIÍÌỈĨỊOÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢUÚÙỦŨỤƯỨỪỬỮỰYÝỲỶỸỴĐaáàảãạâấầẩẫậăắằẳẵặeéèẻẽẹêếềểễệiíìỉĩịoóòỏõọôốồổỗộơớờởỡợuúùủũụưứừửữựyýỳỷỹỵđ".matches("^[A-Za-zÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯưẠ-ỹ]+$"));

Trên là đầy đủ đỉ các kí tự TV bao gồm trong ASCII (A-Za-z), ANSI (ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúý)ngoài ANSI/Unicode(ĂăĐđĨĩŨũƠơƯưẠ-ỹ).

Nên nhớ là trong Regex thì không phải chỗ nào cũng dùng dấu cách được đâu.

Regex tiếng Việt có dấu Java

Joe

Thành viên VIP

  • #7

Regex tiếng Việt có dấu Java
a real developer always looks for his/her own shortest solution. Regex for unicode is bug-ridden, sometimes unreliable and complicated. Why not so:

PHP:

private String[] ascii = { 'A', 'a', ... };
private String[] viet = { 'Ă', 'ă', ... };
...
public String toASCII(String tv) {
  StringBuffer buf = new StringBuffer();
  for(int i = 0, l = tv.length(); i < l; ++i)
  buf.append((viet[i] == tv.charAt(i))? ascii[i]:tv.charAt(i);
  return buf.toString();
}

  • #8

Bạn ơi mình tìm được hàm sao, tuy nhiên, mình không rõ về cách truyền...tham số

PHP:

public static String unAccent(String s) {
                    String temp = Normalizer.normalize(s, Normalizer.Form.NFD);
                    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
                  // return pattern.matcher(temp).replaceAll("");
                    return pattern.matcher(temp).replaceAll("").replaceAll("Đ", "D").replace("đ", "");
            }

PHP:

public static void main(String[] a) throws Exception {

                  Scanner in = new Scanner(System.in);
                  String s = in.nextLine();
                  unAccent(s);

                  System.out.println(unAccent(s));
                  System.out.println(unAccent("Nguyễn Văn Á"));
                // System.out.println(s.matches("^[A-Za-zÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯưẠ-ỹ]+$"));
          }

System.out.println(unAccent(s));
System.out.println(unAccent("Nguyễn Văn Á"));
Bạn ơi , giữa 2 cách truyền này khác nhau như thế nào vậy bạn? Cùng là truyền 2 chuỗi mà, 1 cái là trực tiếp 1 cái là gián tiếp, sao lại kết quả khác nhau. Mong bạn giải thích giúp mình.

Regex tiếng Việt có dấu Java

  • #9

Bạn ơi mình tìm được hàm sao, tuy nhiên, mình không rõ về cách truyền...tham số

PHP:

public static String unAccent(String s) {
                    String temp = Normalizer.normalize(s, Normalizer.Form.NFD);
                    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
                  // return pattern.matcher(temp).replaceAll("");
                    return pattern.matcher(temp).replaceAll("").replaceAll("Đ", "D").replace("đ", "");
            }

PHP:

public static void main(String[] a) throws Exception {

                  Scanner in = new Scanner(System.in);
                  String s = in.nextLine();
                  unAccent(s);

                  System.out.println(unAccent(s));
                  System.out.println(unAccent("Nguyễn Văn Á"));
                // System.out.println(s.matches("^[A-Za-zÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯưẠ-ỹ]+$"));
          }

System.out.println(unAccent(s));
System.out.println(unAccent("Nguyễn Văn Á"));
Bạn ơi , giữa 2 cách truyền này khác nhau như thế nào vậy bạn? Cùng là truyền 2 chuỗi mà, 1 cái là trực tiếp 1 cái là gián tiếp, sao lại kết quả khác nhau. Mong bạn giải thích giúp mình.

Vấn đề là console is not full unicode supported.

Regex tiếng Việt có dấu Java

Joe

Thành viên VIP

  • #10

Chuotcontg,
I suppose you'll make my example running. It's just a hint, not a runnable code. Here is the runnable codes

Regex tiếng Việt có dấu Java

PHP:

private String[] ascii = { 'A', 'a', ... };
private String[] viet = { 'Ă', 'ă', ... };
...
public String toASCII(String tv) {
  StringBuffer buf = new StringBuffer();
  for(int i = 0, l = tv.length(); i < l; ++i) {
       int j;
        for (j = 0; j < viet.length; ++j) if (viet[j] == tv.charAt(i)) break;
        buf.append((j < viet.length)? ascii[j]:tv.charAt(i);
}
  return buf.toString();
}

  • #11

Joe,
Thank you very much, Em would try!

Regex tiếng Việt có dấu Java

  • #12

Joe,
Thank you very much, Em would try!

Regex tiếng Việt có dấu Java

Woa! "Em would try!" I like it

Regex tiếng Việt có dấu Java