Kiểm tra regex của MySQL

Hỗ trợ của MySQL cho các biểu thức chính quy khá hạn chế, nhưng vẫn rất hữu ích. MySQL chỉ có một toán tử cho phép bạn làm việc với các biểu thức chính quy. Đây là toán tử REGEXP, hoạt động giống như toán tử LIKE, ngoại trừ việc thay vì sử dụng các ký tự đại diện _ và %, nó sử dụng một. Mặc dù có tiêu chuẩn "mở rộng" trong tên của tiêu chuẩn, hương vị POSIX ERE là hương vị regex khá cơ bản theo tiêu chuẩn hiện đại. Tuy nhiên, nó làm cho toán tử REGEXP mạnh mẽ và linh hoạt hơn nhiều so với toán tử LIKE đơn giản

Một điểm khác biệt quan trọng giữa toán tử LIKE và REGEXP là toán tử LIKE chỉ trả về True nếu mẫu khớp với toàn bộ chuỗi. e. g. WHERE cột kiểm tra THÍCH 'jg' sẽ chỉ trả về các hàng trong đó cột kiểm tra giống hệt với jg, ngoại trừ sự khác biệt trong trường hợp có lẽ. Mặt khác, WHERE testcolumn REGEXP 'jg' sẽ trả về tất cả các hàng nơi testcolumn có jg ở bất kỳ đâu trong chuỗi. Sử dụng WHERE testcolumn REGEXP '^jg$' để chỉ nhận các cột giống với jg. Tương đương với WHERE testcolumn LIKE 'jg%' sẽ là WHERE testcolumn REGEXP '^jg'. Không cần phải đặt một. * ở cuối biểu thức chính quy (REGEXP tương đương với LIKE's %), vì các kết quả khớp một phần được chấp nhận

MySQL không cung cấp bất kỳ chế độ phù hợp nào. POSIX ERE không hỗ trợ công cụ sửa đổi chế độ bên trong biểu thức chính quy và toán tử REGEXP của MySQL không cung cấp cách chỉ định chế độ bên ngoài biểu thức chính quy. Dấu chấm khớp với tất cả các ký tự bao gồm cả dòng mới và dấu mũ và đô la chỉ khớp ở đầu và cuối chuỗi. Nói cách khác. MySQL coi các ký tự xuống dòng như các ký tự thông thường. Toán tử REGEXP áp dụng biểu thức chính quy không phân biệt chữ hoa chữ thường nếu đối chiếu của bảng không phân biệt chữ hoa chữ thường, đây là mặc định. Nếu bạn thay đổi đối chiếu thành phân biệt chữ hoa chữ thường, toán tử REGEXP sẽ trở thành phân biệt chữ hoa chữ thường

Hãy nhớ rằng MySQL hỗ trợ chuỗi thoát kiểu C trong chuỗi. Mặc dù POSIX ERE không hỗ trợ các mã thông báo như \n để khớp với các ký tự không in được như ngắt dòng, nhưng MySQL hỗ trợ lối thoát này trong các chuỗi của nó. Vì vậy, WHERE testcolumn REGEXP '\n' trả về tất cả các hàng trong đó testcolumn chứa dấu ngắt dòng. MySQL chuyển đổi \n trong chuỗi thành ký tự ngắt dòng đơn trước khi phân tích cú pháp biểu thức chính quy. Điều này cũng có nghĩa là các dấu gạch chéo ngược cần phải được thoát. Biểu thức chính \\ để khớp với một dấu gạch chéo ngược trở thành '\\\\' dưới dạng chuỗi MySQL và biểu thức chính \$ để khớp với ký hiệu đô la trở thành '\\$' dưới dạng chuỗi MySQL. Tất cả điều này không giống như các cơ sở dữ liệu khác như Oracle, không hỗ trợ \n và không yêu cầu thoát dấu gạch chéo ngược

Để trả về các hàng trong đó cột không khớp với biểu thức chính quy, hãy sử dụng WHERE testcolumn NOT REGEXP 'pattern' Toán tử RLIKE là từ đồng nghĩa của toán tử REGEXP. WHERE cột kiểm tra RLIKE 'pattern' và WHERE testcolumn NOT RLIKE 'pattern' giống với WHERE testcolumn REGEXP 'pattern' và WHERE testcolumn NOT REGEXP 'pattern'. Tôi khuyên bạn nên sử dụng REGEXP thay vì RLIKE, để tránh nhầm lẫn với toán tử LIKE

LIB_MYSQLUDF_PREG

Nếu bạn muốn có thêm sức mạnh biểu thức chính quy trong cơ sở dữ liệu của mình, bạn có thể cân nhắc sử dụng LIB_MYSQLUDF_PREG. Đây là thư viện mã nguồn mở chứa các chức năng người dùng MySQL nhập thư viện PCRE. LIB_MYSQLUDF_PREG chỉ được phân phối ở dạng mã nguồn. Để sử dụng nó, bạn cần có khả năng biên dịch và cài đặt nó vào máy chủ MySQL của mình. Việc cài đặt thư viện này không thay đổi hỗ trợ regex tích hợp của MySQL theo bất kỳ cách nào. Nó chỉ làm cho các chức năng bổ sung sau có sẵn

PREG_CAPTURE trích xuất một đối sánh biểu thức chính quy từ một chuỗi. PREG_POSITION trả về vị trí mà tại đó một biểu thức chính quy khớp với một chuỗi. PREG_REPLACE thực hiện tìm kiếm và thay thế trên một chuỗi. PREG_RLIKE kiểm tra xem biểu thức chính quy có khớp với chuỗi không

Tất cả các hàm này lấy một biểu thức chính quy làm tham số đầu tiên của chúng. Biểu thức chính quy này phải được định dạng giống như toán tử biểu thức chính quy Perl. e. g. để kiểm tra xem regex có phù hợp với trường hợp chủ đề không, bạn sẽ sử dụng mã MySQL PREG_RLIKE('/regex/i', chủ đề). Điều này tương tự với , cũng yêu cầu thêm // dấu phân cách cho các biểu thức chính quy bên trong chuỗi PHP

Bản tóm tắt. trong hướng dẫn này, bạn sẽ học cách sử dụng toán tử REGEXP của MySQL để thực hiện các tìm kiếm phức tạp dựa trên các biểu thức chính quy

Giới thiệu về biểu thức chính quy

Biểu thức chính quy là một chuỗi đặc biệt mô tả mẫu tìm kiếm. Nó là một công cụ mạnh giúp bạn xác định các chuỗi văn bản một cách ngắn gọn và linh hoạt. g. , ký tự và từ, dựa trên các mẫu

Ví dụ: bạn có thể sử dụng cụm từ thông dụng để tìm kiếm email, địa chỉ IP, số điện thoại, số an sinh xã hội hoặc bất kỳ thứ gì có mẫu cụ thể

Một biểu thức chính quy sử dụng cú pháp riêng của nó mà bộ xử lý biểu thức chính quy có thể diễn giải. Một biểu thức chính quy được sử dụng rộng rãi trong hầu hết các nền tảng từ ngôn ngữ lập trình đến cơ sở dữ liệu bao gồm cả MySQL

Ưu điểm của việc sử dụng biểu thức chính quy là bạn không bị giới hạn trong việc tìm kiếm một chuỗi dựa trên một mẫu cố định với dấu phần trăm (%) và dấu gạch dưới (_) trong toán tử LIKE. Các biểu thức chính quy có nhiều ký tự meta hơn để xây dựng các mẫu linh hoạt

Nhược điểm của việc sử dụng biểu thức chính quy là khá khó hiểu và duy trì một mẫu phức tạp như vậy. Vì vậy, bạn nên mô tả ý nghĩa của biểu thức chính quy trong chú thích của câu lệnh SQL. Ngoài ra, trong một số trường hợp, tốc độ truy xuất dữ liệu bị giảm nếu bạn sử dụng các mẫu phức tạp trong biểu thức chính quy

Viết tắt của biểu thức chính quy là regex hoặc regexp

Toán tử REGEXP của MySQL

MySQL điều chỉnh biểu thức chính quy do Henry Spencer triển khai. MySQL cho phép bạn khớp mẫu ngay trong câu lệnh SQL bằng cách sử dụng toán tử REGEXP

Phần sau đây minh họa cú pháp của toán tử REGEXP trong mệnh đề  

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
0 clause.

SELECT column_list FROM table_name WHERE string_column REGEXP pattern;

Code language: SQL (Structured Query Language) (sql)

Câu lệnh này thực hiện khớp mẫu của một

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
1 với một

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
2

Nếu một giá trị trong

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
1 khớp với

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
2, biểu thức trong mệnh đề

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
5 trả về true, ngược lại, nó trả về false

Nếu

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
1 hoặc

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
2 là

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
8, thì kết quả là

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)
9

Ngoài toán tử REGEXP, bạn có thể sử dụng toán tử

SELECT productname FROM products WHERE productname REGEXP '^a';

Code language: SQL (Structured Query Language) (sql)
1, là từ đồng nghĩa của toán tử REGEXP

Dạng phủ định của toán tử REGEXP

SELECT productname FROM products WHERE productname REGEXP '^a';

Code language: SQL (Structured Query Language) (sql)
4

Các ví dụ về REGEXP của MySQL

Giả sử bạn muốn tìm tất cả các sản phẩm có họ bắt đầu bằng ký tự A, B hoặc C. Bạn có thể sử dụng biểu thức chính quy trong câu lệnh

SELECT productname FROM products WHERE productname REGEXP '^a';

Code language: SQL (Structured Query Language) (sql)
5 sau đây

SELECT productname FROM products WHERE productname REGEXP '^(A|B|C)' ORDER BY productname;

Code language: SQL (Structured Query Language) (sql)

Kiểm tra regex của MySQL
Kiểm tra regex của MySQL

Mẫu cho phép bạn tìm sản phẩm có tên bắt đầu bằng A, B hoặc C

  • Ký tự ^ có nghĩa là khớp từ đầu chuỗi
  • Nhân vật. có nghĩa là tìm kiếm các lựa chọn thay thế nếu không phù hợp

Bảng sau đây minh họa một số siêu ký tự và cấu trúc thường được sử dụng trong một biểu thức chính quy

MetacharacterBehavior^khớp với vị trí ở đầu chuỗi tìm kiếm$khớp với vị trí ở cuối chuỗi tìm kiếm. khớp với bất kỳ ký tự đơn nào[…]khớp với bất kỳ ký tự nào được chỉ định bên trong dấu ngoặc vuông[^…]khớp với bất kỳ ký tự nào không được chỉ định bên trong dấu ngoặc vuôngsp1. p2khớp với bất kỳ mẫu nào p1 hoặc p2*khớp với ký tự trước 0 hoặc nhiều lần+khớp với ký tự trước một hoặc nhiều lần{n}khớp với n số lần ký tự trước đó{m,n}khớp từ m đến n số lần

Để tìm những sản phẩm có tên bắt đầu bằng ký tự

SELECT productname FROM products WHERE productname REGEXP '^a';

Code language: SQL (Structured Query Language) (sql)
6, bạn sử dụng ký tự phụ 

SELECT productname FROM products WHERE productname REGEXP '^a';

Code language: SQL (Structured Query Language) (sql)
7 để khớp với đầu tên

SELECT productname FROM products WHERE productname REGEXP '^a';

Code language: SQL (Structured Query Language) (sql)

Kiểm tra regex của MySQL
Kiểm tra regex của MySQL

Nếu bạn muốn toán tử REGEXP so sánh các chuỗi theo kiểu phân biệt chữ hoa chữ thường, bạn có thể sử dụng toán tử BINARY  để chuyển một chuỗi thành một .

Bởi vì MySQL so sánh từng chuỗi nhị phân theo từng byte thay vì từng ký tự. Điều này cho phép so sánh chuỗi phân biệt chữ hoa chữ thường

Ví dụ: câu lệnh sau chỉ khớp với chữ hoa

SELECT productname FROM products WHERE productname REGEXP '^a';

Code language: SQL (Structured Query Language) (sql)
9 ở đầu tên sản phẩm

SELECT productname FROM products WHERE productname REGEXP BINARY '^C';

Code language: SQL (Structured Query Language) (sql)

Kiểm tra regex của MySQL
Kiểm tra regex của MySQL

Để tìm sản phẩm có tên kết thúc bằng f, bạn sử dụng

SELECT productname FROM products WHERE productname REGEXP BINARY '^C';

Code language: SQL (Structured Query Language) (sql)
0 để khớp với phần cuối của chuỗi

SELECT productname FROM products WHERE productname REGEXP 'f$'

Code language: SQL (Structured Query Language) (sql)

Kiểm tra regex của MySQL
Kiểm tra regex của MySQL

Để tìm sản phẩm có tên chứa từ

SELECT productname FROM products WHERE productname REGEXP BINARY '^C';

Code language: SQL (Structured Query Language) (sql)
1, bạn sử dụng truy vấn sau

SELECT productname FROM products WHERE productname REGEXP 'ford';

Code language: SQL (Structured Query Language) (sql)

Kiểm tra regex của MySQL
Kiểm tra regex của MySQL

Để tìm sản phẩm có tên chứa chính xác 10 ký tự, bạn sử dụng '

SELECT productname FROM products WHERE productname REGEXP BINARY '^C';

Code language: SQL (Structured Query Language) (sql)
2 và '

SELECT productname FROM products WHERE productname REGEXP BINARY '^C';

Code language: SQL (Structured Query Language) (sql)
3 .
to match the beginning and end of the product name, and repeat

SELECT productname FROM products WHERE productname REGEXP BINARY '^C';

Code language: SQL (Structured Query Language) (sql)
4 times of any character ‘

SELECT productname FROM products WHERE productname REGEXP BINARY '^C';

Code language: SQL (Structured Query Language) (sql)
5
in between as shown in the following query:

SELECT productname FROM products WHERE productname REGEXP '^.{10}$';

Code language: SQL (Structured Query Language) (sql)

Kiểm tra regex của MySQL
Kiểm tra regex của MySQL

Trong hướng dẫn này, bạn đã học cách truy vấn dữ liệu bằng toán tử REGEXP của MySQL với các biểu thức chính quy

MySQL có RegEx không?

MySQL hỗ trợ một loại thao tác so khớp mẫu khác dựa trên biểu thức chính quy và toán tử REGEXP . Nó cung cấp một đối sánh mẫu mạnh mẽ và linh hoạt có thể giúp chúng tôi triển khai các tiện ích tìm kiếm hiệu quả cho các hệ thống cơ sở dữ liệu của chúng tôi.

Làm cách nào để kiểm tra RegEx trong SQL?

Biểu thức chính quy SQL. Cú pháp sử dụng Regex trong SQL. . Biểu thức chính quy SQL

Regexp_substr() trong MySQL là gì?

Hàm REGEXP_SUBSTR() trong MySQL được dùng để khớp mẫu . Hàm này trả về chuỗi con từ chuỗi đầu vào khớp với mẫu biểu thức chính quy đã cho. Nếu không tìm thấy kết quả phù hợp, nó sẽ trả về NULL. Nếu biểu thức hoặc mẫu là NULL, hàm sẽ trả về NULL.

Làm cách nào để khớp mẫu trong MySQL?

Kết hợp mẫu SQL cho phép bạn sử dụng _ để khớp với bất kỳ ký tự đơn nào và % để khớp với số lượng ký tự tùy ý (bao gồm cả ký tự 0) . Trong MySQL, các mẫu SQL không phân biệt chữ hoa chữ thường theo mặc định. Một số ví dụ được hiển thị ở đây. Không sử dụng = hoặc <> khi bạn sử dụng các mẫu SQL.