import java.util.regex.* ;
import java.text.* ;
class Ideone
{
{
String VIETNAMESE_DIACRITIC_CHARACTERS
= "ẮẰẲẴẶĂẤẦẨẪẬÂÁÀÃẢẠĐẾỀỂỄỆÊÉÈẺẼẸÍÌỈĨỊỐỒỔỖỘÔỚỜỞỠỢƠÓÒÕỎỌỨỪỬỮỰƯÚÙỦŨỤÝỲỶỸỴ" ;
/*
for (char c: VIETNAMESE_DIACRITIC_CHARACTERS.toCharArray()) {
System.out.println(c + ": " + Character.getName(c));
}
*/
tests[ 0 ] =
"Bạn chính là tác giả của Wikipedia!\n " +
"Mọi người đều có thể biên tập bài ngay lập tức, chỉ cần nhớ vài quy tắc." +
"Có sẵn rất nhiều trang trợ giúp như tạo bài, sửa bài hay tải ảnh." +
"Bạn cũng đừng ngại đặt câu hỏi.\n " +
"Hiện chúng ta có 1.109.446 bài viết và 406.782 thành viên." ;
tests[ 1 ] =
Normalizer.normalize ( tests[ 0 ] , Normalizer.Form .NFD ) ;
/*
for (char c: tests[1].toCharArray()) {
System.out.printf("%04x ", (int) c);
}
*/
tests[ 2 ] =
Normalizer.normalize ( tests[ 0 ] , Normalizer.Form .NFC ) ;
try {
Pattern p =
Pattern.compile ( "[A-Z" + VIETNAMESE_DIACRITIC_CHARACTERS + "]++(" ,
Pattern.CANON_EQ |
Pattern.CASE_INSENSITIVE |
Pattern.UNICODE_CASE ) ;
Matcher m = p.matcher ( t) ;
while ( m.find ( ) ) {
System .
out .
print ( m.
group ( ) + " " ) ; }
}
}
}
}
aW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwppbXBvcnQgamF2YS50ZXh0Lio7CgpjbGFzcyBJZGVvbmUKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJICAgU3RyaW5nIFZJRVROQU1FU0VfRElBQ1JJVElDX0NIQVJBQ1RFUlMgCgkJCT0gIuG6ruG6sOG6suG6tOG6tsSC4bqk4bqm4bqo4bqq4bqsw4LDgcOAw4PhuqLhuqDEkOG6vuG7gOG7guG7hOG7hsOKw4nDiOG6uuG6vOG6uMONw4zhu4jEqOG7iuG7kOG7kuG7lOG7luG7mMOU4bua4buc4bue4bug4buixqDDk8OSw5Xhu47hu4zhu6jhu6rhu6zhu67hu7DGr8Oaw5nhu6bFqOG7pMOd4buy4bu24bu44bu0IjsKCgkJLyoKCQlmb3IgKGNoYXIgYzogVklFVE5BTUVTRV9ESUFDUklUSUNfQ0hBUkFDVEVSUy50b0NoYXJBcnJheSgpKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihjICsgIjogIiArIENoYXJhY3Rlci5nZXROYW1lKGMpKTsKCQl9CgkJKi8KCQkKCQlTdHJpbmcgdGVzdHNbXSA9IG5ldyBTdHJpbmdbM107CgkJdGVzdHNbMF0gPSAKCQkJIkLhuqFuIGNow61uaCBsw6AgdMOhYyBnaeG6oyBj4bunYSBXaWtpcGVkaWEhXG4iICsgCgkJCSJN4buNaSBuZ8aw4budaSDEkeG7gXUgY8OzIHRo4buDIGJpw6puIHThuq1wIGLDoGkgbmdheSBs4bqtcCB04bupYywgY2jhu4kgY+G6p24gbmjhu5sgdsOgaSBxdXkgdOG6r2MuIiArCgkJCSJDw7Mgc+G6tW4gcuG6pXQgbmhp4buBdSB0cmFuZyB0cuG7oyBnacO6cCBuaMawIHThuqFvIGLDoGksIHPhu61hIGLDoGkgaGF5IHThuqNpIOG6o25oLiIgKyAKCQkJIkLhuqFuIGPFqW5nIMSR4burbmcgbmfhuqFpIMSR4bq3dCBjw6J1IGjhu49pLlxuIiArCgkJCSJIaeG7h24gY2jDum5nIHRhIGPDsyAxLjEwOS40NDYgYsOgaSB2aeG6v3QgdsOgIDQwNi43ODIgdGjDoG5oIHZpw6puLiI7CgkJCQoJCXRlc3RzWzFdID0KCQkJTm9ybWFsaXplci5ub3JtYWxpemUodGVzdHNbMF0sIE5vcm1hbGl6ZXIuRm9ybS5ORkQpOwoJCS8qCgkJZm9yIChjaGFyIGM6IHRlc3RzWzFdLnRvQ2hhckFycmF5KCkpIHsKCQkJU3lzdGVtLm91dC5wcmludGYoIiUwNHggIiwgKGludCkgYyk7CgkJfQoJCSovCQoJCXRlc3RzWzJdID0KCQkJTm9ybWFsaXplci5ub3JtYWxpemUodGVzdHNbMF0sIE5vcm1hbGl6ZXIuRm9ybS5ORkMpOwoJCQoJCXRyeSB7CgogICAgUGF0dGVybiBwID0KICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIltBLVoiICsgVklFVE5BTUVTRV9ESUFDUklUSUNfQ0hBUkFDVEVSUyArICJdKysoIiwKICAgICAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5DQU5PTl9FUSB8CiAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm4uVU5JQ09ERV9DQVNFKTsKCQkJCgkJCWZvciAoU3RyaW5nIHQ6IHRlc3RzKSB7CgkJCQlNYXRjaGVyIG0gPSBwLm1hdGNoZXIodCk7CgkJCQl3aGlsZSAobS5maW5kKCkpIHsKCQkJCQlTeXN0ZW0ub3V0LnByaW50KG0uZ3JvdXAoKSArICIgIik7CgkJCQl9CgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKCQl9Cgl9Cn0=