Chắc không ai đi tách cái mã hàng đó cả, bởi chắc đã có bảng mã đó rồi. Khi đó, người ta làm như vầy: =LOOKUP(2,1/SEARCH(danh_muc_ma,chuoi_can_xet),danh_muc_ma)
Cái (7) của anh là hơi mạo hiểm. Nhỡ nó phát sinh như dưới đây thì sai, theo em ý tưởng như bài #2 có lý, có danh sách mã, rồi tách từ danh mục mã đó lấy mã trong cụm ký tự, tất nhiên chỉ là đoán thôi, không trúng ta làm lại
Chắc không ai đi tách cái mã hàng đó cả, bởi chắc đã có bảng mã đó rồi. Khi đó, người ta làm như vầy: =LOOKUP(2,1/SEARCH(danh_muc_ma,chuoi_can_xet),danh_muc_ma)
Function tach(text As String)
With CreateObject("vbscript.regexp")
.Global = True: .Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
tach = .Replace(text, "$1")
End With
End Function
Giả sử dữ liệu bạn tại cột A, bạn dùng công thúc: B1 =tach(A1) rồi fill xuông!!
Function tach(text As String)
With CreateObject("vbscript.regexp")
.Global = True: .Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
tach = .Replace(text, "$1")
End With
End Function
Giả sử dữ liệu bạn tại cột A, bạn dùng công thúc: B1 =tach(A1) rồi fill xuông!!
Ví dụ, em xét đoạn text "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)"
PHP:
Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
Em giải thích từng đoạn đoạn trong pattern
[a-zA-Z] là một kí tự bất kì từ a->z hoặc A-Z có thể là a,b,C,G...
[a-zA-Z] + là chuỗi kí tự đó nhiều hơn hoặc bằng 1 kí tự có thể là: B, aC, bDF, dasKJK...
\d là kí tự phải là số (0-9)
\d{5,} yêu cầu số này là số có 5 chữ số trờ lên
Tức là đoạn \b[a-zA-Z]+\d{5,} yêu cầu là đoạn đầu phải là các kí tự anpha có ít nhất là một kí tự và đoạn sau phải là chuỗi số có ít nhất 5 kí tự
\b ở đây vị trí của tập [a-zA-Z] và không phải tập [a-zA-Z], trong trường hợp này là khoảng trắng, có thể thay \b thành \s hoặc " " đều được.
.* có nghĩ là một chuỗi bất kì có ít nhất 0 kí tự, dấu ^ là yêu cầu bắt buộc xét chuỗi từ đầu chuỗi, dấu $ là yêu cầu bắt buộc phãi xét đến cuối chuỗi.
Trong đây em có sử dụng (...) , khi mà sử dụng dấu (..) thì reg sẽ tự động lưu những gì trong dấu ngoặc đó vào bộ nhớ submatches (trừ một số trường hợp như (?=)(?(?!)....). "$1" tức là những gì trong dấu ngoặc thứ nhất đã được lưu.
Trong cái pattern trên thì em chỉ sữ dụng có 1 (...) duy nhất nên vị trí lưu của nó là số 1 (submatches(0)). Đoạn text này "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" khi so với paterrn "^.*(\b[a-zA-Z]+\d{5,}).*$" thì có thể phân tích như vây
Đoạn "Áo thun bé gái tay ngắn " sẽ là ^.* Đoạn "G017001" sẽ là (\b[a-zA-Z]+\d{5,})., vì dùng dấu () nên G017001 sẽ được lưu vào submatches với vị trí số 1
Đoạn (18-24M, Cam) sẽ là .*$ Tức là đoạn phù hợp với paterrn cũng chính là chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" và $1 là "G017001"
Khi replace(text,"S1") tức lả chuyển chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" thành "G017001".
Hi vọng anh hiểu!!!
Ví dụ, em xét đoạn text "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)"
PHP:
Pattern = "^.*(\b[a-zA-Z]+\d{5,}).*$"
Em giải thích từng đoạn đoạn trong pattern
[a-zA-Z] là một kí tự bất kì từ a->z hoặc A-Z có thể là a,b,C,G...
[a-zA-Z] + là chuỗi kí tự đó nhiều hơn hoặc bằng 1 kí tự có thể là: B, aC, bDF, dasKJK...
\d là kí tự phải là số (0-9)
\d{5,} yêu cầu số này là số có 5 chữ số trờ lên
Tức là đoạn \b[a-zA-Z]+\d{5,} yêu cầu là đoạn đầu phải là các kí tự anpha có ít nhất là một kí tự và đoạn sau phải là chuỗi số có ít nhất 5 kí tự
\b ở đây vị trí của tập [a-zA-Z] và không phải tập [a-zA-Z], trong trường hợp này là khoảng trắng, có thể thay \b thành \s hoặc " " đều được.
.* có nghĩ là một chuỗi bất kì có ít nhất 0 kí tự, dấu ^ là yêu cầu bắt buộc xét chuỗi từ đầu chuỗi, dấu $ là yêu cầu bắt buộc phãi xét đến cuối chuỗi.
Trong đây em có sử dụng (...) , khi mà sử dụng dấu (..) thì reg sẽ tự động lưu những gì trong dấu ngoặc đó vào bộ nhớ submatches (trừ một số trường hợp như (?=)(?(?!)....). "$1" tức là những gì trong dấu ngoặc thứ nhất đã được lưu.
Trong cái pattern trên thì em chỉ sữ dụng có 1 (...) duy nhất nên vị trí lưu của nó là số 1 (submatches(0)). Đoạn text này "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" khi so với paterrn "^.*(\b[a-zA-Z]+\d{5,}).*$" thì có thể phân tích như vây
Đoạn "Áo thun bé gái tay ngắn " sẽ là ^.* Đoạn "G017001" sẽ là (\b[a-zA-Z]+\d{5,})., vì dùng dấu () nên G017001 sẽ được lưu vào submatches với vị trí số 1
Đoạn (18-24M, Cam) sẽ là .*$ Tức là đoạn phù hợp với paterrn cũng chính là chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" và $1 là "G017001"
Khi replace(text,"S1") tức lả chuyển chuỗi "Áo thun bé gái tay ngắn G017001 (18-24M, Cam)" thành "G017001".
Hi vọng anh hiểu!!!