Chào chú Switom,
Thắc mắc 1:
Ví dụ của cháu là: Với chuỗi : Chuyển tiền tiếp khách theo hoá đơn số 0001234
Kết quả cần tìm: 0001234 ( Đây là dãy số gồm có độ dài là 7), nếu có nhiều đoạn thỏa tiêu chí thì lấy cái đầu.
Thắc mắc thứ 2:
Trong code: re.Pattern = "((?:0[0-9])|(?:[12][0-9])|(?:3[01]))/((?:0[1-9])|(?:1[0-2]))/(?:19|20)\d\d"
cháu chưa hiểu ?: mang ý nghĩa là gì.
Theo cháu nghĩ ?:0[0-9] là lấy giá trị bằng 0
?:[12][0-9] là lấy giá trị bằng 12, hiểu như thế đúng không chú
và \d\d mang ý nghĩa là gì vậy ah,
cháu thấy trong hướng dẫn của chú về VBscrip thì \d Có nghĩa là chữ số, tương đương với [0-9]. Được phép dùng trong […] nhưng \d\d thì cháu không hiểu.
1. Về 0[0-9]
0 là ký tự 0
[0-9] là 1 ký tự trong tập 0, 1, 2, ..., 9
Vậy 0[0-9] là 2 ký tự mà trong đó ký tự đầu là 0 còn ký tự thứ 2 là 1 ký tự trong tập 0, 1, 2, ..., 9
Tức các số 00, 01, 02, ..., 09 khớp với 0[0-9]
Có thể dùng (0[0-9]) nhưng lúc đó các đoạn khớp sẽ được ghi nhớ, tức tốn điện nước. Còn viết (?:0[0-9]) thì các đoạn khớp không được ghi nhớ, tức không tốn điện nước.
Tổng quát (?
attern) thì các đoạn khớp với pattern sẽ không được ghi nhớ, tức không tốn điện nước.
Trên cơ sở đó thì
[12][0-9] là 2 ký tự mà ký tự 1 là 1 hoặc 2 còn ký tự thứ 2 là 0, 1, 2, ... hoặc 9, tức 10, 11, ..., 19, 20, 21, ..., 29 đều khớp
3[01] là 2 ký tự mà ký tự 1 là 3 còn ký tự thứ 2 là 0 hoặc 1, tức 30, 31 đều khớp
Vậy
(?:0[0-9])|(?:[12][0-9])|(?:3[01]) = (0[0-9])|([12][0-9])|(3[01]) = 0[0-9] hoặc [12][0-9] hoặc 3[01] tức
00, 01, 02, ..., 09 hoặc 10, 11, ..., 19, 20, 21, ..., 29 hoặc 30, 31 đều khớp
tức 00, 01, ..., 09, 10, 11, ..., 19, 20, 21, ..., 29, 30, 31 đều khớp tức 00, 01, ..., 31 đều khớp.
2. Về \d\d
\d là 1 chữ số từ tập 0, 1, ..., 9. Vậy thì \d\d là 2 chữ số, thế thôi.
\d\d = \d{2}
Cần nói thêm là code chỉ có nhiệm vụ lọc dữ liệu thôi. Còn nhiệm vụ của dữ liệu là phải ĐÚNG. Tức dữ liệu không có kiểu vd.31/02/2014
Nhưng nếu chắc chắn ngoài ngày tháng ra thì trong chuỗi không còn cái gì khác có dạng **/**/**** (* là chữ số) thì cũng có thể dùng pattern đơn giản: pattern = "\d{2}
/\d{2}
/\d{4}"
Tôi nhắc lại là dùng pattern trên chỉ khi ngoài ngày tháng ra thì trong chuỗi không còn cái gì khác có dạng **/**/****. Ví dụ không có 94/12/2004 QĐ - Quyết định (của Bộ trưởng) số 94 ra tháng 12 năm 2004 (he he)
Còn nếu có thể có **/**/**** mà không là ngày tháng thì phải sửa code.
--------------
Thắc mắc 1:
Lấy code y như bài trước nhưng Pattern = "\d{7}"