{"id":14037,"date":"2021-08-21T12:24:17","date_gmt":"2021-08-21T12:24:17","guid":{"rendered":"https:\/\/freehost.page\/?p=14037"},"modified":"2021-08-21T12:24:17","modified_gmt":"2021-08-21T12:24:17","slug":"cau-lenh-regex-dau-thanh-viet","status":"publish","type":"post","link":"https:\/\/kiencang.net\/cau-lenh-regex-dau-thanh-viet\/","title":{"rendered":"C\u00e2u l\u1ec7nh Regex \u0111\u1ec3 b\u1eaft l\u1ed7i \u0111\u1eb7t d\u1ea5u thanh trong ti\u1ebfng Vi\u1ec7t"},"content":{"rendered":"\n
Trong b\u00e0i vi\u1ebft n\u00e0y t\u00f4i s\u1eed d\u1ee5ng quy t\u1eafc \u0111\u1eb7t d\u1ea5u thanh ki\u1ec3u c\u0169, ch\u00fang ta t\u1ea1m \u0111\u1eb7t ra b\u00ean ngo\u00e0i c\u00e1c tranh c\u00e3i v\u1ec1 m\u1eb7t ng\u00f4n ng\u1eef h\u1ecdc. L\u00fd do ch\u1ee7 y\u1ebfu t\u00f4i ch\u1ecdn c\u00e1ch n\u00e0y, v\u00ec n\u00f3 ph\u1ed5 bi\u1ebfn h\u01a1n, \u0111\u00e2y c\u0169ng l\u00e0 quy t\u1eafc m\u1eb7c \u0111\u1ecbnh trong tr\u00ecnh h\u1ed7 tr\u1ee3 g\u00f5 ti\u1ebfng Vi\u1ec7t ph\u1ed5 bi\u1ebfn l\u00e0 Unikey.<\/p>\n\n\n\n
Quy t\u1eafc l\u00e0 th\u1ebf n\u00e0y:<\/p>\n\n\n\n
OK, gi\u1edd ch\u00fang ta s\u1ebd \u0111i v\u00e0o ph\u1ea7n b\u1eaft l\u1ed7i c\u00e1c t\u1eeb kh\u00f4ng tu\u00e2n th\u1ee7 quy t\u1eafc tr\u00ean. \u0110\u1ec3 \u0111\u1ee1 ph\u1ee9c t\u1ea1p, code m\u1eabu \u0111\u01b0\u1ee3c t\u00f4i vi\u1ebft cho t\u1eeb vi\u1ebft th\u01b0\u1eddng, vi\u1ebft HOA th\u00ec b\u1ea1n ch\u1ec9 c\u1ea7n b\u1ed5 sung th\u00eam l\u00e0 \u0111\u01b0\u1ee3c, quan tr\u1ecdng l\u00e0 khi hi\u1ec3u v\u1ea5n \u0111\u1ec1 th\u00ec vi\u1ec7c th\u00eam s\u1ebd kh\u00f4ng kh\u00f3 kh\u0103n g\u00ec.<\/p>\n\n\n\n
B\u1ea1n c\u00f3 th\u1ec3 mu\u1ed1n tham kh\u1ea3o 2 t\u00e0i nguy\u00ean gi\u00fap \u00edch cho qu\u00e1 tr\u00ecnh n\u00e0y:<\/p>\n\n\n\n
Ch\u00fang ta b\u1eaft \u0111\u1ea7u v\u1edbi ngo\u1ea1i l\u1ec7 c\u1ee7a gi v\u00e0 qu tr\u01b0\u1edbc:<\/p>\n\n\n\n
(^(g[\u00ed\u00ec\u1ec9\u0129\u1ecb]|q[\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1])[a\u0103\u00e2e\u00eao\u00f4\u01a1u\u01b0iy])[a-z]*<\/code><\/pre>\n\n\n\nN\u00f3 s\u1ebd b\u1eaft l\u1ed7i c\u00e1c t\u1eeb nh\u01b0 th\u1ebf n\u00e0y:<\/p>\n\n\n\n
g\u00eda\ng\u00edong\ng\u00ed\u00eang\nq\u00faa\nq\u00faan\ng\u00ecau\ng\u00ec\u00eang<\/code><\/pre>\n\n\n\n- Ti\u1ebfp \u0111\u1ebfn l\u00e0 c\u00e1c t\u1eeb c\u00f3 2 nguy\u00ean \u00e2m \u1edf cu\u1ed1i, d\u1ea5u s\u1ebd \u0111\u1eb7t \u1edf nguy\u00ean \u00e2m \u0111\u1ea7u, ch\u00fang ta s\u1ebd b\u1eaft l\u1ed7i c\u00e1c t\u1eeb \u0111\u1eb7t \u1edf nguy\u00ean \u00e2m sau:<\/li><\/ul>\n\n\n\n
([bcdfhjklmnprstvxz\u0111]*[a\u0103\u00e2eo\u00f4\u01a1u\u01b0iy][\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00e9\u00e8\u1ebb\u1ebd\u1eb9\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb])$<\/code><\/pre>\n\n\n\nL\u01b0u \u00fd l\u00e0 \u0111o\u1ea1n s\u1ebd kh\u00f4ng c\u00f3 [bcdfhjklmnprstvxz\u0111]<\/code> g v\u00e0 q, v\u00ec n\u1ebfu \u0111\u1eb7t v\u00e0o n\u00f3 s\u1ebd m\u00e2u thu\u1eabn v\u1edbi nguy\u00ean t\u1eafc gi v\u00e0 qu.<\/p>\n\n\n\nD\u1ea5u $ \u0111\u1eb7t cu\u1ed1i \u0111\u1ec3 ch\u1ec9 th\u1ecb sau n\u00f3 kh\u00f4ng c\u00f2n c\u00f3 t\u1eeb n\u00e0o n\u1eefa, v\u00ec ch\u00fang ta b\u1eaft l\u1ed7i n\u00e0y ch\u1ec9 v\u1edbi t\u1eeb c\u00f3 2 nguy\u00ean \u00e2m.<\/p>\n\n\n\n
Trong nh\u00f3m [\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00e9\u00e8\u1ebb\u1ebd\u1eb9\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb]<\/code> c\u0169ng kh\u00f4ng c\u00f3 \u00ea v\u00e0 \u01a1, v\u00ec 2 t\u1eeb n\u00e0y \u0111\u01b0\u1ee3c ph\u00e9p c\u00f3 d\u1ea5u d\u00f9 v\u1ecb tr\u00ed c\u1ee7a n\u00f3 \u1edf \u0111\u00e2u.<\/p>\n\n\n\n\u0110o\u1ea1n m\u00e3 tr\u00ean s\u1ebd b\u1eaft l\u1ed7i c\u00e1c t\u1eeb nh\u01b0 th\u1ebf n\u00e0y:<\/p>\n\n\n\n
ho\u1ea1\nho\u00e0\nha\u1ecd\nke\u00f3\nme\u1ecd\nco\u00ed<\/code><\/pre>\n\n\n\n- Gi\u1edd ch\u00fang ta x\u1eed l\u00fd vi\u1ec7c t\u1eeb c\u00f3 3 nguy\u00ean \u00e2m li\u00ean ti\u1ebfp ho\u1eb7c 2 nguy\u00ean \u00e2m v\u00e0 c\u00f3 \u00edt nh\u1ea5t m\u1ed9t t\u1eeb \u0111\u1eb1ng sau \u0111\u00f3. N\u1ebfu t\u1eeb c\u00f3 3 nguy\u00ean \u00e2m, l\u1ed7i s\u1ebd x\u1ea3y ra n\u1ebfu d\u1ea5u n\u1eb1m \u1edf nguy\u00ean \u00e2m \u0111\u1ea7u, ho\u1eb7c nguy\u00ean \u00e2m cu\u1ed1i. N\u1ebfu t\u1eeb c\u00f3 2 nguy\u00ean \u00e2m v\u00e0 \u00edt nh\u1ea5t m\u1ed9t t\u1eeb \u0111\u1ee9ng cu\u1ed1i, b\u1eaft l\u1ed7i s\u1ebd x\u1ea3y ra n\u1ebfu d\u1ea5u n\u1eb1m \u1edf nguy\u00ean \u00e2m \u0111\u1ea7u.<\/li><\/ul>\n\n\n\n
\u0110o\u1ea1n m\u00e3 Regex b\u1eaft l\u1ed7i d\u1ea5u \u1edf nguy\u00ean \u00e2m \u0111\u1ea7u trong tr\u01b0\u1eddng h\u1ee3p c\u00f3 3 nguy\u00ean \u00e2m ho\u1eb7c 2 nguy\u00ean \u00e2m + ph\u1ee5 \u00e2m cu\u1ed1i:<\/p>\n\n\n\n
([a-z\u0111]*[\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00e9\u00e8\u1ebb\u1ebd\u1eb9\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][a\u0103\u00e2\u00eaeo\u00f4\u01a1u\u01b0iy][a\u0103\u00e2e\u00eao\u00f4\u01a1u\u01b0iybcdghklmnpqrstvx]+)<\/code><\/pre>\n\n\n\nCh\u00fang ta c\u1ea7n b\u1ed5 sung th\u00eam tr\u01b0\u1eddng h\u1ee3p 3 nguy\u00ean \u00e2m v\u00e0 d\u1ea5u n\u1eb1m \u1edf nguy\u00ean \u00e2m cu\u1ed1i:<\/p>\n\n\n\n
[bcdfghjklmnpqrstvxz\u0111]*[a\u0103\u00e2e\u00eao\u00f4\u01a1u\u01b0iy][a\u0103\u00e2e\u00eao\u00f4\u01a1u\u01b0iy][\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00e9\u00e8\u1ebb\u1ebd\u1eb9\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][a-z]*<\/code><\/pre>\n\n\n\nK\u1ebft qu\u1ea3 n\u00f3 s\u1ebd b\u1eaft l\u1ed7i c\u00e1c t\u1eeb nh\u01b0 th\u1ebf n\u00e0y:<\/p>\n\n\n\n
h\u00f2ang\nh\u00f9ynh\nt\u00f2an\nt\u01b0\u01a1\u00ed\ntoa\u00ec\nt\u00f3ai<\/code><\/pre>\n\n\n\n- Cu\u1ed1i c\u00f9ng l\u00e0 b\u1eaft l\u1ed7i t\u1eeb c\u00f3 d\u1ea5u c\u00f3 \u00ea ho\u1eb7c \u01a1, m\u00e0 d\u1ea5u kh\u00f4ng n\u1eb1m \u1edf \u00ea ho\u1eb7c \u01a1<\/li><\/ul>\n\n\n\n
M\u00e3 Regex v\u1edbi \u00ea:<\/p>\n\n\n\n
[a-z\u0103\u00e2\u00f4\u01a1\u01b0\u0111]*[\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edd\u1edb\u1edf\u1ee1\u1ee3\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][a-z]*\u00ea[a-z\u0103\u00e2\u00f4\u01a1\u01b0]*<\/code><\/pre>\n\n\n\nN\u00f3 s\u1ebd b\u1eaft l\u1ed7i c\u00e1c t\u1eeb nh\u01b0 th\u1ebf n\u00e0y:<\/p>\n\n\n\n
ch\u1ee5y\u00ean\nchu\u1ef5\u00ean\nl\u00fay\u00ean\nlu\u1ef5\u00ean\nt\u00fa\u00ea\nt\u1ee5\u00ea<\/code><\/pre>\n\n\n\nT\u01b0\u01a1ng t\u1ef1 l\u00e0 m\u00e3 Regex v\u1edbi \u01a1:<\/p>\n\n\n\n
[a-z\u0103\u00e2\u00f4\u00ea\u01b0\u0111]*[\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][a-z]*\u01a1[a-z\u0103\u00e2\u00f4\u01a1\u01b0]*<\/code><\/pre>\n\n\n\nCu\u1ed1i c\u00f9ng l\u00e0 \u0111o\u1ea1n m\u00e3 t\u1ed5ng h\u1ee3p v\u1edbi m\u1ed9t ch\u00fat ch\u1ec9nh s\u1eeda th\u00eam \u0111\u1ec3 b\u1eaft l\u1ed7i c\u00e1c tr\u01b0\u1eddng h\u1ee3p \u0111\u1eb7t sai d\u1ea5u thanh:<\/p>\n\n\n\n
(((g[\u00ed\u00ec\u1ec9\u0129\u1ecb]|q[\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1])[a\u0103\u00e2e\u00eao\u00f4\u01a1u\u01b0iy])[a-z]*)|([bcdfhjklmnprstvxz\u0111]*[a\u0103\u00e2eo\u00f4\u01a1u\u01b0iy][\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00e9\u00e8\u1ebb\u1ebd\u1eb9\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb])$|([a-z\u0111]*[\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00e9\u00e8\u1ebb\u1ebd\u1eb9\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][a\u0103\u00e2\u00eaeo\u00f4\u01a1u\u01b0iy][a\u0103\u00e2e\u00eao\u00f4\u01a1u\u01b0iybcdfghklmnpqrstvx]+)|([bcdfghjklmnpqrstvxz\u0111]*[a\u0103\u00e2\u00eaeo\u00f4\u01a1u\u01b0iy][a\u0103\u00e2\u00eaeo\u00f4\u01a1u\u01b0iy][\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00e9\u00e8\u1ebb\u1ebd\u1eb9\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][bcdfghjklmnpqrstvxz]*)|([a-z\u0103\u00e2\u00f4\u01a1\u01b0\u0111]*[\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edd\u1edb\u1edf\u1ee1\u1ee3\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][a-z]*\u00ea[a-z\u0103\u00e2\u00f4\u01a1\u01b0]*)|([a-z\u0103\u00e2\u00f4\u00ea\u01b0\u0111]*[\u00e1\u00e0\u1ea3\u00e3\u1ea1\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u00f3\u00f2\u1ecf\u00f5\u1ecd\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u00fa\u00f9\u1ee7\u0169\u1ee5\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u00fd\u1ef3\u1ef7\u1ef9\u1ef5\u00ed\u00ec\u1ec9\u0129\u1ecb][a-z]*\u01a1[a-z\u0103\u00e2\u00f4\u01a1\u01b0]*)<\/code><\/pre>\n\n\n\n