Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

REGEX trong MySQL để chỉ hiển thị số được phân tách bằng dấu gạch ngang

Lọc chuỗi theo pattern số-dấu gạch ngang với REGEXP trong MySQL

Sử dụng toán tử REGEXP (Regular Expression) để tìm các chuỗi khớp với mẫu: chỉ chứa số và dấu gạch ngang (-), theo định dạng số điện thoại kiểu Mỹ: XXX-XXX-XXXX.

Ví dụ minh họa

Tạo bảng DemoTable:

mysql> CREATE TABLE DemoTable (Code VARCHAR(100));
Query OK, 0 rows affected (1.16 sec)

Chèn dữ liệu (có chuỗi hợp lệ và không hợp lệ):

mysql> INSERT INTO DemoTable VALUES('100-677-9876');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO DemoTable VALUES('100-677-9876-John');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable VALUES('David-100-677-9876');
Query OK, 1 row affected (0.16 sec)

Xem dữ liệu:

mysql> SELECT * FROM DemoTable;
+--------------------+
| Code               |
+--------------------+
| 100-677-9876       |
| 100-677-9876-John  |
| David-100-677-9876 |
+--------------------+
3 rows in set (0.00 sec)

Regex khớp chính xác định dạng XXX-XXX-XXXX:

mysql> SELECT * FROM DemoTable 
WHERE Code REGEXP '^\\(?[0-9]{3}\\)?[\\s-]?[0-9]{3}[\\s-]?[0-9]{4}$';

Kết quả (chỉ dòng đầu khớp):

+--------------+
| Code         |
+--------------+
| 100-677-9876 |
+--------------+
1 row in set (0.00 sec)

Giải thích Regex pattern

^           # Bắt đầu chuỗi
\(?          # Dấu '(' tùy chọn (cho định dạng (123) 456-7890)
[0-9]{3}     # Đúng 3 chữ số
\)?          # Dấu ')' tùy chọn
[\s-]?       # Khoảng trắng HOẶC dấu gạch ngang (tùy chọn)
[0-9]{3}     # Đúng 3 chữ số
[\s-]?       # Khoảng trắng HOẶC dấu gạch ngang (tùy chọn)
[0-9]{4}     # Đúng 4 chữ số
$           # Kết thúc chuỗi

Các pattern đơn giản hơn cho trường hợp này

Yêu cầuPattern
Chỉ số và dấu -, đúng 12 ký tự (XXX-XXX-XXXX)'^[0-9]{3}-[0-9]{3}-[0-9]{4}$'
Cho phép dấu cách thay cho -'^[0-9]{3}[- ][0-9]{3}[- ][0-9]{4}$'
Chỉ chứa số và - (bất kỳ độ dài)'^[0-9-]+$'
Bắt đầu bằng số, chỉ chứa số và -'^[0-9][0-9-]*$'

Lưu ý hiệu suất

  • REGEXP không sử dụng index thông thường → full table scan
  • Với bảng lớn: cân nhắc Generated Column + Index, hoặc xử lý ở application layer
  • MySQL 8.0+: hỗ trợ REGEXP_LIKE(), REGEXP_SUBSTR(), REGEXP_REPLACE()