Mục lục
Trong hướng dẫn này, chúng ta sẽ tìm hiểu sâu về cách sử dụng biểu thức chính quy để khớp chuỗi trong Excel.
Khi bạn cần tìm một giá trị nhất định trong một dải ô của các ô, bạn sẽ sử dụng hàm MATCH hoặc XMATCH. Khi tìm kiếm một chuỗi cụ thể trong một ô, các hàm TÌM KIẾM và TÌM KIẾM sẽ rất hữu ích. Và làm cách nào để bạn biết liệu một ô có chứa thông tin khớp với một mẫu nhất định hay không? Rõ ràng, bằng cách sử dụng các biểu thức chính quy. Nhưng ngoài hộp Excel không hỗ trợ biểu thức chính quy! Đừng lo lắng, chúng tôi sẽ buộc phải làm như vậy :)
Hàm Regex VBA Excel để khớp chuỗi
Như tiêu đề đã khá rõ ràng, để sử dụng các biểu thức chính quy trong Excel, bạn cần tạo hàm của riêng mình. May mắn thay, VBA của Excel có một đối tượng RegExp sẵn có, bạn có thể sử dụng đối tượng này trong mã của mình như được hiển thị bên dưới:
Hàm công khai RegExpMatch(input_range As Range, pattern As String , tùy chọn match_case As Boolean = True ) As Variant Dim arRes() As Variant 'mảng để lưu kết quả Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long' chỉ số của hàng hiện tại trong phạm vi nguồn, chỉ số của cột hiện tại trong phạm vi nguồn, số lượng hàng, số lượng các cột Khi Lỗi GoTo ErrHandl RegExpMatch = arRes Đặt regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = mẫu regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True Chấm dứtbiểu thức.Mẫu : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Để hiểu rõ hơn những gì đang diễn ra ở đây, chúng ta hãy xem xét kỹ hơn từng phần :
- Tên người dùng có thể bao gồm các chữ cái, số, dấu gạch dưới, dấu chấm và dấu gạch nối. Lưu ý rằng \w khớp với bất kỳ chữ cái, chữ số hoặc dấu gạch dưới nào, chúng tôi nhận được biểu thức chính quy sau: [\w\.\-]+
- Tên miền có thể bao gồm chữ hoa và chữ thường, chữ số, dấu gạch nối (nhưng không ở vị trí đầu tiên hoặc cuối cùng) và dấu chấm (trong trường hợp tên miền phụ). Vì dấu gạch dưới không được phép, thay vì \w, chúng tôi đang sử dụng 3 bộ ký tự khác nhau: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
- Tên miền cấp cao nhất bao gồm một dấu chấm theo sau là chữ hoa và chữ thường. Nó có thể chứa từ 2 đến 24 chữ cái (TLD dài nhất hiện đang tồn tại): \.[A-Za-z]{2,24}
Lưu ý. Mẫu giả sử tên miền chứa 2 hoặc nhiều ký tự chữ và số.
Với văn bản gốc ở khổ A5 và mẫu ở khổ A5, công thức sẽ có dạng như sau:
=RegExpMatch(A5, $A$2)
Hoặc bạn có thể sử dụng một công thức đơn giản hơn biểu thức để xác thực email bằng bộ ký tự chữ thường hoặc chữ hoa:
Mẫu : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Nhưng hãy đặt công thức của bạn không phân biệt chữ hoa chữ thường:
=RegExpMatch(A5, $A$2, FALSE)
Công thức IF của Excel với biểu thức chính quy đối sánh
Do thực tế là có sẵn và tùy chỉnhcác chức năng hoạt động trơn tru, không có gì ngăn cản bạn sử dụng chúng cùng nhau trong một công thức duy nhất.
Để trả về hoặc tính toán một thứ gì đó nếu một biểu thức chính quy khớp và một thứ khác nếu nó không khớp, hãy nhúng RegExpMatch tùy chỉnh hàm trong văn bản logic của IF:
IF(RegExpMatch(…), [value_if_true], [value_if_false])Ví dụ: nếu một chuỗi trong A5 chứa địa chỉ email hợp lệ, bạn có thể trả về "Có"; nếu không thì "Không".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
Đếm xem regex có khớp không
Bởi vì các hàm gốc của Excel không hỗ trợ các biểu thức chính quy, nên nó không thể đặt biểu thức chính quy trực tiếp vào hàm COUNTIS hoặc COUNTIFS. May mắn thay, bạn có thể mô phỏng chức năng này bằng chức năng tùy chỉnh của chúng tôi.
Giả sử bạn đã sử dụng biểu thức chính quy để khớp số điện thoại và xuất kết quả trong cột B. Để biết có bao nhiêu ô chứa số điện thoại, bạn chỉ cần để đếm các giá trị TRUE trong B5:B9. Và điều đó có thể dễ dàng thực hiện bằng cách sử dụng công thức COUNTIF tiêu chuẩn:
=COUNTIF(B5:B9, TRUE)
Bạn không muốn có thêm bất kỳ cột nào trong trang tính của mình? Không vấn đề gì. Lưu ý rằng hàm tùy chỉnh của chúng ta có thể xử lý nhiều ô cùng một lúc và hàm SUM của Excel có thể cộng các giá trị trong một mảng, bạn sẽ làm như sau:
- Cung cấp một tham chiếu phạm vi cho RegExpMatch để hàm này trả về một mảng các giá trị TRUE và FALSE.
- Sử dụng phủ định kép (--) để ép các giá trị logic thành giá trị đơn vàsố không.
- Lấy hàm SUM để cộng các số 1 và 0 trong mảng kết quả.
=SUM(--RegExpMatch(A5:A9, $A$2))
Kết hợp biểu thức chính quy với Ultimate Suite
Người dùng Ultimate Suite của chúng tôi có thể tận dụng bốn hàm Regex mạnh mẽ mà không cần thêm bất kỳ mã VBA nào vào sổ làm việc của họ vì chúng được tích hợp trơn tru vào Excel trong quá trình cài đặt phần bổ trợ. Các hàm tùy chỉnh của chúng tôi được xử lý bởi công cụ .NET RegEx tiêu chuẩn và hỗ trợ các biểu thức chính quy cổ điển đầy đủ tính năng.
Cách sử dụng hàm RegexMatch tùy chỉnh
Giả sử bạn đã cài đặt phiên bản Ultimate Suite mới nhất ( 2021.4 trở lên), bạn có thể tạo công thức Regex Match theo hai bước đơn giản:
- Trên tab Dữ liệu Ablebits , trong nhóm Văn bản , hãy nhấp vào Công cụ Regex .
- Chọn chuỗi nguồn.
- Nhập mẫu của bạn.
- Chọn tùy chọn Khớp .
- Để có kết quả dưới dạng công thức, không phải giá trị, hãy chọn Chèn dưới dạng hộp kiểm .
- Nhấp vào nút Kết hợp .
Một lúc sau, hàm AblebitsRegexMatch được chèn vào một cột mới ở bên phải dữ liệu của bạn.
Trong ảnh chụp màn hình bên dưới, hàm kiểm tra xem các chuỗi trong cột A có chứa 7 chữ số không số hay không.
Mẹo:
- Chức năng có thể chèn trực tiếp vào một ô thông qua hộp thoại Chèn Hàm tiêu chuẩn, trong đó nó được phân loại trong AblebitsUDFs .
- Theo mặc định, một biểu thức chính quy được thêm vào công thức nhưng bạn cũng có thể giữ nguyên nó trong một ô riêng biệt. Đối với điều này, chỉ cần sử dụng tham chiếu ô cho đối số thứ 2.
- Theo mặc định, hàm này phân biệt chữ hoa chữ thường . Để khớp không phân biệt chữ hoa chữ thường, hãy sử dụng mẫu (?i).
Để biết thêm thông tin, vui lòng xem hàm AblebitsRegexMatch.
Đó là cách thực hiện khớp cụm từ thông dụng trong Excel. Tôi cảm ơn bạn đã đọc và mong được gặp bạn trên blog của chúng tôi vào tuần tới!
Các bản tải xuống có sẵn
Các ví dụ về Excel Regex Match (tệp .xlsm)
Ultimate Suite 14- day phiên bản đầy đủ chức năng (tệp .exe)
Nếu cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 Đến cntInputRows, 1 Đến cntInputCols) Đối với iInputCurRow = 1 Đến cntInputRows Đối với iInputCurCol = 1 Đến cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Testrange(inputCurCol) .Cells(iInputCurRow, iInputCurCol).Value) Tiếp theo Tiếp theo RegExpMatch = arRes Thoát Hàm ErrHandl: RegExpMatch = CVErr(xlErrValue) Kết thúc HàmDán mã vào trình chỉnh sửa VBA và hàm RegExpMatch mới của bạn là sẵn sàng để sử dụng. Nếu bạn chưa có nhiều kinh nghiệm với VBA, hướng dẫn này có thể hữu ích: Cách chèn mã VBA vào Excel.
Lưu ý. Sau khi chèn mã, hãy nhớ lưu tệp của bạn dưới dạng sổ làm việc hỗ trợ macro (.xlsm).
Cú pháp RegExpMatch
Hàm RegExpMatch kiểm tra xem có phần nào của chuỗi nguồn khớp với biểu thức chính quy hay không. Kết quả là một giá trị Boolean: TRUE nếu tìm thấy ít nhất một giá trị khớp, ngược lại là FALSE.
Hàm tùy chỉnh của chúng tôi có 3 đối số - hai đối số đầu tiên là bắt buộc và đối số cuối cùng là tùy chọn:
RegExpMatch(văn bản , pattern, [match_case])Ở đâu:
- Văn bản (bắt buộc) - một hoặc nhiều chuỗi để tìm kiếm. Có thể được cung cấp dưới dạng tham chiếu ô hoặc phạm vi.
- Mẫu (bắt buộc) - biểu thức chính quy để khớp. Khi được đặt trực tiếp trong công thức, mẫu phải được đặt trong dấu ngoặc kép.
- Match_case (tùy chọn) - xác định đối sánhloại hình. Nếu TRUE hoặc bị bỏ qua (mặc định), khớp phân biệt chữ hoa chữ thường được thực hiện; nếu FALSE - không phân biệt chữ hoa chữ thường.
Hàm này hoạt động trong tất cả các phiên bản Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 và Excel 2010.
3 điều bạn nên biết về RegExpMatch
Trước khi chúng ta bắt đầu tính toán thực tế, vui lòng lưu ý những điểm sau để làm rõ một số vấn đề kỹ thuật:
- Hàm này có thể xử lý một ô đơn lẻ hoặc phạm vi ô . Trong trường hợp thứ hai, kết quả được trả về trong các ô lân cận ở dạng mảng động hoặc phạm vi tràn, như minh họa trong ví dụ này.
- Theo mặc định, hàm này phân biệt chữ hoa chữ thường . Để bỏ qua trường hợp văn bản, hãy đặt đối số match_case thành FALSE. Do các giới hạn VBA Regexp, mẫu phân biệt chữ hoa chữ thường (?i) không được hỗ trợ.
- Nếu không tìm thấy mẫu hợp lệ, hàm sẽ trả về FALSE; nếu mẫu không hợp lệ , lỗi #VALUE! xảy ra lỗi.
Dưới đây, bạn sẽ tìm thấy một số ví dụ về đối sánh biểu thức chính quy được tạo cho mục đích trình diễn. Chúng tôi không thể đảm bảo rằng các mẫu của chúng tôi sẽ hoạt động trơn tru với nhiều loại dữ liệu đầu vào hơn trong trang tính thực của bạn. Trước khi đưa vào sản xuất, hãy nhớ kiểm tra và điều chỉnh các mẫu mẫu của chúng tôi theo nhu cầu của bạn.
Cách sử dụng biểu thức chính quy để khớp chuỗi trong Excel
Khi tất cả các chuỗi bạn muốn khớp đều có cùng một mô hình,biểu thức chính quy là một giải pháp lý tưởng.
Giả sử bạn có một dải ô (A5:A9) chứa các chi tiết khác nhau về một số mục. Bạn muốn biết ô nào có SKU. Giả sử rằng mỗi SKU bao gồm 2 chữ cái in hoa, dấu gạch nối và 3 chữ số, bạn có thể khớp chúng bằng cách sử dụng biểu thức sau.
Mẫu : \b[A-Z]{2}-\ d{3}\b
Trong đó [A-Z]{2} có nghĩa là 2 chữ cái viết hoa bất kỳ từ A đến Z và \d{3} có nghĩa là 3 chữ số bất kỳ từ 0 đến 9. Ký tự \b biểu thị một từ ranh giới, nghĩa là SKU là một từ riêng biệt và không phải là một phần của chuỗi lớn hơn, chẳng hạn như 23-MAR-2022.
Khi mẫu đã được thiết lập, chúng ta có thể chuyển sang viết công thức. Về cơ bản, sử dụng hàm tùy chỉnh không khác gì hàm gốc. Ngay khi bạn bắt đầu nhập công thức, tên của hàm sẽ xuất hiện trong danh sách được đề xuất bởi tính năng Tự động điền của Excel. Tuy nhiên, có một số sắc thái trong Dynamic Array Excel (Microsoft 365 và Excel 2021) cũng như Excel truyền thống (2019 và các phiên bản cũ hơn).
Khớp chuỗi trong một ô
Để khớp chuỗi trong một ô duy nhất, tham chiếu đến ô đó trong đối số đầu tiên. Đối số thứ hai được cho là chứa một biểu thức chính quy.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Mẫu này cũng có thể được giữ trong một ô xác định trước, được khóa bằng một tham chiếu tuyệt đối ($A$2):
=RegExpMatch(A5, $A$2)
Sau khi nhập công thức vào ô đầu tiên, bạn có thể kéo công thức xuống tất cả các hàng khác.
Phương pháp nàyhoạt động tuyệt vời trong tất cả các phiên bản Excel .
So khớp các chuỗi trong nhiều ô cùng một lúc
Để khớp nhiều chuỗi với một công thức, bao gồm một tham chiếu phạm vi trong đối số đầu tiên:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Trong Excel 365 và Excel 2021 hỗ trợ mảng động, nó hoạt động theo cách này - bạn nhập công thức vào ô đầu tiên, nhấn Enter và công thức sẽ tự động tràn vào các ô bên dưới.
Trong Excel 2019 trở về trước, nó chỉ hoạt động như một công thức mảng CSE truyền thống, được nhập vào một dải ô và được hoàn thành bằng cách nhấn đồng thời các phím Ctrl + Shift + Enter.
Regex để khớp số
Để khớp với bất kỳ chữ số đơn nào từ 0 đến 9, hãy sử dụng ký tự \d trong biểu thức chính quy. Tùy thuộc vào nhiệm vụ cụ thể của bạn, hãy thêm một bộ định lượng phù hợp hoặc tạo một mẫu phức tạp hơn.
Regex để khớp với bất kỳ số nào
Để khớp với bất kỳ số nào có độ dài bất kỳ, hãy đặt bộ định lượng + ngay sau dấu / ký tự d, cho biết tìm kiếm các số có chứa 1 chữ số trở lên.
Mẫu : \d+
=RegExpMatch(A5:A9, "\d+")
Regex để khớp số có độ dài cụ thể
Nếu mục tiêu của bạn là khớp các giá trị số chứa một số chữ số nhất định, thì hãy sử dụng \d cùng với một bộ định lượng thích hợp.
Ví dụ: để khớp với số hóa đơn bao gồm chính xác 7 chữ số, bạn sẽ sử dụng \d{7}. Tuy nhiên, xin lưu ý rằng nó sẽ khớp với 7như mong đợi:
Lưu ý:
- Mã quốc tế không được kiểm tra nên có thể có hoặc không.
- Trong các biểu thức chính quy, \s là viết tắt của bất kỳ ký tự khoảng trắng nào, chẳng hạn như dấu cách, tab, ký tự xuống dòng hoặc dòng mới. Để chỉ cho phép khoảng trắng, hãy sử dụng [-\. ] thay vì [-\.\s].
- [^13] sẽ khớp với bất kỳ ký tự đơn nào không phải là 1 hoặc 3.
- [^1-3] sẽ khớp với bất kỳ ký tự đơn nào không phải là 1, 2 hoặc 3 (tức là bất kỳ chữ số nào từ 1 đến 3).
- Biểu thức chính quy ở trên chỉ hoạt động đối với các chuỗi một dòng . Trong trường hợp chuỗi milti-line, các ký tự ^ và $ khớp với đầu và cuối của mỗi dòng thay vì đầu và cuối của chuỗi đầu vào, do đó regex chỉ tìm kiếm trong dòng đầu tiên.
- Để khớp các chuỗi không bắt đầu với một số văn bản , hãy sử dụng một biểu thức chính quy như ^(?!lemons).*$
- Để khớp các chuỗi không kết thúc với văn bản nhất định , hãy bao gồmchuỗi kết thúc neo vào mẫu tìm kiếm: ^((?!lemons$).)*$
Regex KHÔNG khớp ký tự
Để tìm các chuỗi KHÔNG chứa một ký tự nhất định, bạn có thể sử dụng các lớp ký tự phủ định [^ ] khớp bất cứ điều gì KHÔNG trong ngoặc. Ví dụ:
Trong danh sách số điện thoại, giả sử bạn muốn tìm những số không có mã quốc gia. Lưu ý rằng mọi mã quốc tế đều có dấu +, bạn có thể sử dụng lớp ký tự [^\+] để tìm các chuỗi không chứa dấu cộng. Điều quan trọng là phải nhận ra rằng biểu thức trên khớp với bất kỳ ký tự đơn nào không phải là +. Bởi vì một số điện thoại có thể ở bất kỳ đâu trong một chuỗi, không nhất thiết phải ở đầu, bộ định lượng * được thêm vào để kiểm tra từng ký tự tiếp theo. Các neo $ bắt đầu và kết thúc đảm bảo rằng toàn bộ chuỗi được xử lý. Kết quả là chúng ta nhận được biểu thức chính quy bên dưới có nội dung "không khớp với ký tự + ở bất kỳ vị trí nào trong chuỗi".
Mẫu :^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex KHÔNG khớp chuỗi
Mặc dù không có cú pháp biểu thức chính quy đặc biệt nào cho không khớp với một chuỗi cụ thể, bạn có thể mô phỏng hành vi này bằng cách sử dụng giao diện tiêu cực.
Giả sử bạn muốn tìm các chuỗi không chứa từ "lemons". Biểu thức chính quy này sẽ hoạt động hiệu quả:
Pattern : ^((?!lemons).)*$
Rõ ràng, cần có một số lời giải thích ở đây. Nhìn phía trước phủ định (?! chanh) nhìn sang bên phải để xem có từ "chanh" nào phía trước không. Nếu không có "chanh", thì dấu chấm khớp với bất kỳ ký tự nào ngoại trừ dấu ngắt dòng. Biểu thức trên chỉ thực hiện một lần kiểm tra và bộ định lượng * lặp lại nó từ 0 lần trở lên, từ đầu chuỗi được neo bởi ^ đến cuối chuỗi được neo bởi $.
Để bỏ qua trường hợp văn bản, chúng tôi đặt đối số thứ 3 thành FALSE để làm cho chức năng của chúng tôi không phân biệt chữ hoa chữ thường:
=RegExpMatch(A5, $A$2, FALSE)
Mẹo và lưu ý:
Kết hợp không phân biệt chữ hoa chữ thường
Trong các biểu thức chính quy cổ điển, có một mẫu đặc biệt cho kết hợp không phân biệt chữ hoa chữ thường (?i), không được hỗ trợ trong VBA RegExp. Để khắc phục giới hạn này, hàm tùy chỉnh của chúng tôi chấp nhận đối số tùy chọn thứ 3 có tên match_case . Để thực hiện khớp không phân biệt chữ hoa chữ thường, bạn chỉ cần đặt thành FALSE.
Giả sử bạn muốn xác định các ngày như 1-Mar-22 hoặc 01-Mar-2022. Để phù hợp với định dạng dd-mmm-yyyy và d-mmm-yy , chúng tôi đang sử dụng biểu thức chính quy sau.
Mẫu : \b\d{1,2}-(Tháng 1chữ số ở bất kỳ đâu trong chuỗi kể cả số có 10 chữ số hoặc 100 chữ số. Nếu đây không phải là thứ bạn đang tìm kiếm, hãy đặt từ ranh giới \b ở cả hai bên.
Mẫu : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex để khớp số điện thoại
Vì số điện thoại có thể được viết ở nhiều định dạng khác nhau nên việc khớp chúng đòi hỏi một biểu thức chính quy phức tạp hơn.
Trong tập dữ liệu dưới đây, chúng tôi sẽ tìm kiếm các số có 10 chữ số có 3 chữ số ở 2 nhóm đầu và 4 chữ số ở nhóm cuối. Các nhóm có thể được phân tách bằng dấu chấm, dấu gạch ngang hoặc dấu cách. Nhóm đầu tiên có thể có hoặc không được đặt trong ngoặc đơn.
Mẫu: (\(\d{3}\)