Regular Expressions: A Practical Tutorial — txt1.ai

March 2026 · 17 min read · 3,971 words · Last Updated: March 31, 2026Advanced

💡 Key Takeaways

  • What Regular Expressions Actually Are (And Why You Should Care)
  • The Building Blocks: Characters, Quantifiers, and Character Classes
  • Capturing Groups and Backreferences: Extracting What You Need
  • Lookaheads and Lookbehinds: Advanced Pattern Matching

Tôi vẫn nhớ ngày mà tôi đã dành sáu giờ để thủ công làm sạch một tập dữ liệu gồm 50,000 địa chỉ email của khách hàng. Đó là năm 2012, tôi là một phân tích viên dữ liệu junior tại một công ty thương mại điện tử cỡ trung, và tôi không biết về biểu thức chính quy. Tôi đã sao chép, dán, tìm kiếm, thay thế và chửi rủa qua từng bảng tính. Quản lý của tôi đi qua vào khoảng giờ thứ tư và hỏi tôi đang làm gì. Khi tôi giải thích, cô ấy đã cười - không phải không tử tế - và nói, "Bạn biết rằng regex có thể làm điều đó chỉ trong khoảng ba mươi giây, đúng không?"

💡 Những Điểm Chính

  • Biểu thức Chính quy Thực sự Là Gì (Và Tại Sao Bạn Nên Quan Tâm)
  • Các Thành phần Cơ bản: Ký Tự, Bộ Đếm và Lớp Ký Tự
  • Nhóm Bắt và Tham chiếu Lại: Trích Xuất Những Gì Bạn Cần
  • Lookaheads và Lookbehinds: Khớp Mẫu Nâng Cao

Khoảnh khắc đó đã thay đổi sự nghiệp của tôi. Mười hai năm sau, với vai trò là một kỹ sư dữ liệu cấp cao đã xử lý hàng tỷ bản ghi trong các công ty y tế, tài chính và công nghệ, tôi có thể tự tin nói rằng biểu thức chính quy là kỹ năng bị đánh giá thấp nhất trong công việc dữ liệu. Chúng không quyến rũ. Chúng không tạo được tiêu đề như học máy hay blockchain. Nhưng chúng là sự khác biệt giữa việc dành cả buổi chiều cho công việc thủ công nhàm chán và dành thời gian để giải quyết những vấn đề thực sự.

Hướng dẫn này không phải để ghi nhớ cú pháp mơ hồ hay trở thành một phù thủy regex trong một đêm. Nó về việc hiểu các mẫu thực tiễn sẽ tiết kiệm cho bạn hàng giờ mỗi tuần. Tôi sẽ cho bạn thấy các biểu thức chính xác mà tôi sử dụng thường xuyên nhất, giải thích lý do tại sao chúng hoạt động và cung cấp cho bạn các tình huống thực tế nơi chúng đã cứu những dự án tôi đã làm. Khi kết thúc, bạn sẽ có một bộ công cụ giúp bạn hiệu quả hơn đáng kể trong việc xử lý văn bản, làm sạch dữ liệu và xác nhận.

Biểu thức Chính quy Thực sự Là Gì (Và Tại Sao Bạn Nên Quan Tâm)

Biểu thức chính quy - viết tắt là regex - là các mẫu mô tả văn bản. Hãy coi chúng như một ngôn ngữ tìm kiếm mạnh mẽ hơn nhiều so với chức năng "tìm" đơn giản trong trình soạn thảo văn bản của bạn. Thay vì tìm kiếm các kết quả chính xác như "[email protected]", bạn có thể tìm kiếm các mẫu như "bất cứ điều gì trông giống như một địa chỉ email".

Dưới đây là lý do tại sao điều này quan trọng về mặt thực tiễn: Trong vai trò hiện tại của tôi, tôi thường xuyên làm việc với các tệp log chứa hàng triệu mục. Tháng trước, tôi cần trích xuất tất cả các địa chỉ IP từ một tệp log máy chủ kích thước 2.3 GB để phân tích các mẫu lưu lượng. Nếu không có regex, tôi sẽ cần phải viết một bộ phân tích tùy chỉnh, có thể từ 50-100 dòng mã, với việc xử lý cẩn thận các trường hợp biên. Với regex, chỉ cần một dòng: \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b. Thời gian thực hiện: 4.7 giây.

Tác động kinh doanh là có thật. Một đồng nghiệp tại một công ty dịch vụ tài chính từng cho tôi biết rằng họ đang kiểm tra thủ công mô tả giao dịch để phân loại chi phí - khoảng 200 giao dịch mỗi ngày, mất khoảng 45 phút. Tôi đã giúp họ viết ba mẫu regex tự động hóa 87% quá trình phân loại. Điều đó tiết kiệm 39 phút hàng ngày, hoặc khoảng 140 giờ mỗi năm cho một người. Nhân điều đó trên một đội nhóm, bạn đang nói về những con số thực sự.

Biểu thức chính quy hoạt động trên hầu như mọi ngôn ngữ lập trình và nhiều công cụ bạn đã sử dụng. Python, JavaScript, Java, C#, Ruby, PHP - tất cả đều hỗ trợ regex. Ngay cả Excel cũng có chức năng regex hạn chế thông qua các chức năng mới hơn. Các trình soạn thảo văn bản như VS Code, Sublime Text và Vim sử dụng regex để tìm và thay thế. Các công cụ dòng lệnh như grep, sed và awk được xây dựng xung quanh regex. Học một lần, sử dụng ở mọi nơi.

Có một đường cong học tập, tôi không nói dối. Cú pháp regex trông đáng sợ ngay từ cái nhìn đầu tiên. Nhưng đây là những gì tôi đã học được từ việc đào tạo hàng chục kỹ sư junior: bạn không cần phải thành thạo mọi thứ. Khoảng 80% công việc thực tiễn với regex sử dụng có thể chỉ 20% của các tính năng có sẵn. Tập trung vào những mẫu cốt lõi đó, và bạn sẽ xử lý phần lớn tình huống thực tế.

Các Thành phần Cơ bản: Ký Tự, Bộ Đếm và Lớp Ký Tự

Hãy bắt đầu với các yếu tố cơ bản. Trong regex, hầu hết các ký tự khớp với chính chúng theo nghĩa đen. Mẫu cat khớp với từ "cat" trong văn bản. Đơn giản thôi. Nhưng regex trở nên mạnh mẽ khi bạn sử dụng các ký tự đặc biệt khớp với các mẫu thay vì văn bản tĩnh.

"Biểu thức chính quy là sự khác biệt giữa việc dành sáu giờ cho việc làm sạch dữ liệu thủ công và dành ba mươi giây để viết một mẫu thực hiện hoàn hảo mỗi lần."

Dấu chấm (.) là ký tự đặc biệt đầu tiên của bạn. Nó khớp với bất kỳ ký tự đơn lẻ nào ngoại trừ một dòng mới. Vậy c.t sẽ khớp với "cat", "cot", "cut" và thậm chí "c9t". Tôi thường xuyên sử dụng điều này khi tôi biết cấu trúc dữ liệu nhưng không biết nội dung chính xác. Ví dụ, khi phân tích các mã sản phẩm theo mẫu "AB-1234-XY", tôi có thể sử dụng ..-.{4}-.. để khớp với bất kỳ mã nào có cấu trúc đó.

Các bộ đếm cho regex biết số lần một thứ gì đó nên xuất hiện. Dấu hoa thị (*) có nghĩa là "không hoặc nhiều lần", dấu cộng (+) có nghĩa là "một hoặc nhiều lần" và dấu hỏi (?) có nghĩa là "không hoặc một lần". Dưới đây là một ví dụ thực tiễn: Một lần tôi cần làm sạch các số điện thoại có nhiều định dạng khác nhau - một số có dấu ngoặc, một số có dấu gạch ngang, một số có khoảng trống. Mẫu \(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4} đã xử lý tất cả các biến thể. Các dấu hỏi làm cho dấu ngoặc và các ký tự phân tách là tùy chọn.

Các lớp ký tự cho phép bạn khớp với các tập hợp ký tự cụ thể. Dấu ngoặc vuông xác định một lớp: [aeiou] khớp với bất kỳ nguyên âm nào. Bạn có thể sử dụng các khoảng: [a-z] khớp với bất kỳ chữ cái thường nào, [0-9] khớp với bất kỳ chữ số nào. Tôi thường xuyên sử dụng [A-Za-z0-9] để xác nhận ký tự alphanumeric. Cũng có các lớp viết tắt: \d cho các chữ số, \w cho các ký tự từ (chữ cái, chữ số, dấu gạch dưới) và \s cho khoảng trắng.

Dưới đây là một tình huống thực tế từ năm ngoái: Tôi đã xử lý các phản hồi khảo sát nơi mọi người nhập tuổi theo nhiều định dạng bất nhất - "25", "25 năm", "25 năm tuổi", "hai mươi lăm", v.v. Đối với các mục số, \d{1,3}\s*(years?|yrs?)? đã lưu trữ hầu hết các biến thể. \d{1,3} khớp với một đến ba chữ số, \s* khớp với khoảng trắng tùy chọn, và các dấu ngoặc với ký tự ống (|) tạo ra một nhóm tùy chọn khớp với "năm", "năm", "yr" hoặc "yrs".

Các mốc neo rất quan trọng để khớp chính xác. Dấu mũ (^) khớp với đầu dòng, và dấu đô la ($) khớp với cuối dòng. Nếu không có các mốc neo, \d{3} sẽ khớp với "123" ở bất cứ đâu trong "abc123def". Với các mốc neo, ^\d{3}$ chỉ khớp nếu toàn bộ dòng chính xác là ba chữ số. Tôi đã học điều này theo cách khó khăn khi xác thực dữ liệu người dùng - không có các mốc neo, bộ xác thực "mã ba chữ số" của tôi đã chấp nhận "abc123def456" vì nó đã tìm thấy ba chữ số ở đâu đó trong đó.

Nhóm Bắt và Tham chiếu Lại: Trích Xuất Những Gì Bạn Cần

Các dấu ngoặc đơn trong regex không chỉ nhóm các lựa chọn - chúng còn lưu trữ văn bản khớp để sử dụng sau này. Đây là nơi regex chuyển từ "tìm kiếm mẫu" sang "trích xuất và biến đổi dữ liệu." Tôi sử dụng các nhóm bắt trong khoảng 60% công việc regex của mình.

Cách Tiếp Cận Thời Gian Cần Thiết Tỷ Lệ Lỗi Khả Năng Mở Rộng
Tìm/Thay Thế Thủ Công Giờ đến ngày Cao (mệt mỏi của con người) Kém (không mở rộng)
Các Phương Pháp Chuỗi Cơ Bản Phút đến giờ Trung bình (các mẫu hạn chế) Vừa phải (chỉ các trường hợp đơn giản)
Biểu thức Chính quy Giây đến phút Thấp (logic nhất quán) Tuyệt vời (xử lý hàng triệu)
Các Kịch Bản Phân Tích Tùy Chỉnh Giờ để viết Thấp (nếu được kiểm tra tốt) Tốt (nhưng yêu cầu bảo trì nhiều)

Giả sử bạn có các ngày theo định dạng "2024-03-15" và cần chuyển đổi chúng thành "03/15/2024". Mẫu (\d{4})-(\d{2})-(\d{2}) tạo ra ba nhóm bắt. Trong hầu hết các ngôn ngữ lập trình, bạn có thể tham chiếu những phần này: nhóm 1 là năm, nhóm 2 là tháng, nhóm 3 là ngày. Bạn có thể sắp xếp lại chúng: $2/$3/$1 trong chuỗi thay thế sẽ cho bạn định dạng mới.

Tôi gần đây đã sử dụng kỹ thuật này để xử lý 18,000 mô tả sản phẩm cần định dạng lại. Định dạng ban đầu là "ProductName (SKU: 12345) - $99.99" và chúng tôi cần "12345 | ProductName | $99.99". Mẫu (.+?) \(SKU: (\d+)\) - (\$[\d.]+) đã trích xuất được ba thành phần, và phần thay thế $2 | $1 | $3 đã sắp xếp lại chúng. Thời gian tổng cộng: khoảng 90 giây để viết và kiểm tra regex, 2.3 giây để xử lý tất cả các bản ghi.

Các nhóm không bắt rất hữu ích khi bạn cần nhóm cho sự thay thế hoặc các bộ đếm nhưng không muốn lưu trữ văn bản. Sử dụng (?:...) thay cho (...). Ví dụ, (?:Mr|Ms|Mrs)\. ([A-Z][a-z]+) khớp với các tiêu đề nhưng chỉ lưu trữ tên. Điều này giữ cho các nhóm bắt của bạn được đánh số một cách hợp lý và có thể cải thiện hiệu suất một chút trên các tập dữ liệu lớn.

Các tham chiếu lại cho phép bạn khớp với văn bản giống như văn bản đã được lưu trữ trước đó trong mẫu. Cú pháp là \1 cho nhóm đầu tiên, \2 cho nhóm thứ hai, v.v..

T

Written by the Txt1.ai Team

Our editorial team specializes in writing, grammar, and language technology. We research, test, and write in-depth guides to help you work smarter with the right tools.

Share This Article

Twitter LinkedIn Reddit HN

Related Tools

YAML to JSON Converter — Free, Instant, Validated How to Decode JWT Tokens — Free Guide JavaScript Formatter — Free Online

Related Articles

Paraphrasing vs Plagiarism: Where to Draw the Line - TXT1.ai Content Rewriting Without Plagiarism Git Workflow for Small Teams (Keep It Simple)

Put this into practice

Try Our Free Tools →

🔧 Explore More Tools

Ai Code ExplainerLorem GeneratorTranslatorDiff ViewerIp LookupDiff Checker

📬 Stay Updated

Get notified about new tools and features. No spam.