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

Khớp cuối dòng tùy chọn sau mỗi bản ghi với REGEXP?

Regex MySQL: Khớp mẫu có phần số tùy chọn ở cuối

Sử dụng REGEXP với pattern cho phép nhóm số tùy chọn (([^0-9]|$)) sau tiền tố cố định để lọc bản ghi.

Ví dụ minh họa

Tạo bảng DemoTable:

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

Chèn dữ liệu (có bản ghi có số phụ sau mã nhân viên):

mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:100 John Smith');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:16537 Chris Brown');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:100 David Miller');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:100 23432 David Miller');
Query OK, 1 row affected (0.20 sec)

Xem dữ liệu:

mysql> SELECT * FROM DemoTable;
+---------------------------------+
| EmployeeCode                    |
+---------------------------------+
| EMPLOYEE:100 John Smith         |
| EMPLOYEE:16537 Chris Brown      |
| EMPLOYEE:100 David Miller       |
| EMPLOYEE:100 23432 David Miller |
+---------------------------------+
4 rows in set (0.00 sec)

Tìm bản ghi bắt đầu bằng "EMPLOYEE:100" theo sau là KHÔNG PHẢI SỐ (hoặc kết thúc chuỗi):

mysql> SELECT * FROM DemoTable 
WHERE EmployeeCode REGEXP "EMPLOYEE:100([^0-9]|$)";

Kết quả (loại bỏ dòng có "EMPLOYEE:100 23432..."):

+---------------------------------+
| EmployeeCode                    |
+---------------------------------+
| EMPLOYEE:100 John Smith         |
| EMPLOYEE:100 David Miller       |
| EMPLOYEE:100 23432 David Miller |
+---------------------------------+
3 rows in set (0.00 sec)

Giải thích Pattern "EMPLOYEE:100([^0-9]|$)"

EMPLOYEE:100   # Chuỗi cố định bắt buộc
(              # Nhóm bắt buộc (phải khớp 1 trong 2):
  [^0-9]       #   Ký tự KHÔNG phải số (0-9): khoảng trắng, chữ, dấu câu...
  |            #   HOẶC
  $            #   Kết thúc chuỗi (end of string)
)              # Kết thúc nhóm

Áp dụng lên dữ liệu:

  • EMPLOYEE:100 John Smith → sau "100" là khoảng trắng [^0-9] → Khớp
  • EMPLOYEE:100 David Miller → sau "100" là khoảng trắng → Khớp
  • EMPLOYEE:100 23432 David Miller → sau "100" là khoảng trắng [^0-9] → Khớp (lưu ý: pattern chỉ kiểm tra ký tự TIẾP THEO, không phải toàn bộ số 23432)
  • EMPLOYEE:16537 Chris Brown → không bắt đầu bằng "EMPLOYEE:100" → Không khớp

⚠️ Sửa pattern để LOẠI BỎ "EMPLOYEE:100 23432..."

Nếu muốn chỉ giữ "EMPLOYEE:100" theo sau ngay lập tức là KHÔNG PHẢI SỐ (loại bỏ có số phụ):

-- Yêu cầu: sau "100" phải là non-digit HOẶC end-of-string
WHERE EmployeeCode REGEXP '^EMPLOYEE:100([^0-9]|$)';

Pattern ^EMPLOYEE:100([^0-9]|$):

  • ^: Bắt đầu chuỗi
  • EMPLOYEE:100: Tiền tố cố định
  • ([^0-9]|$): Ký tự tiếp theo KHÔNG phải số HOẶC kết thúc chuỗi
  • Kết quả: Loại bỏ "EMPLOYEE:100 23432..." (vì sau "100" là space → khớp [^0-9] → vẫn giữ. Cần pattern phức tạp hơn để loại space+số)

Pattern chính xác hơn (loại bỏ space + số)

-- Sau "100" chỉ cho phép: space+chữ, space+end, hoặc end ngay
WHERE EmployeeCode REGEXP '^EMPLOYEE:100( [A-Za-z]|$)';