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

Dùng REGEXP trong MySQL để lọc chuỗi có đúng N từ (phân cách bởi dấu cách)

Regex pattern '^[^ ]+([ ][^ ]+){N-1}$' khớp chuỗi có đúng N từ phân cách bởi dấu cách đơn.

Ví dụ: Tìm chuỗi có đúng 2 từ

Pattern: '^[^ ]+ [^ ]+$' (từ 1 + space + từ 2, không có space đầu/cuối).

Tạo bảng:

CREATE TABLE DemoTable1412 (Name VARCHAR(40));
INSERT INTO DemoTable1412 VALUES 
('John Adam Carol'), ('Mike Sam'), ('Chris James Robert');

Truy vấn:

SELECT * FROM DemoTable1412 
WHERE Name REGEXP '^[^ ]+ [^ ]+$';

Kết quả

Name
Mike Sam

Giải thích pattern

  • ^: Bắt đầu chuỗi.
  • [^ ]+: 1 hoặc nhiều ký tự KHÔNG PHẢI space (từ đầu tiên).
  • : Một dấu cách đơn.
  • [^ ]+: Từ thứ hai.
  • $: Kết thúc chuỗi.

Pattern tổng quát cho N từ

^[^ ]+( [^ ]+){N-1}$
  • N=1: ^[^ ]+$
  • N=2: ^[^ ]+ [^ ]+$
  • N=3: ^[^ ]+( [^ ]+){2}$
  • N=4: ^[^ ]+( [^ ]+){3}$

⚠️ Hạn chế

  • Chỉ xử lý dấu cách đơn ( ). Không khớp tab, nhiều space, newline.
  • Cải tiến: ^[^[:space:]]+([[:space:]]+[^[:space:]]+){N-1}$ (dùng POSIX class [:space:]).
  • Không xử lý tốt Unicode space.

MySQL 8.0+: REGEXP_SUBSTR đếm từ

SELECT Name,
       (LENGTH(Name) - LENGTH(REPLACE(Name, ' ', '')) + 1) AS word_count
FROM DemoTable1412
HAVING word_count = 2;

Cách này đơn giản hơn: đếm số space + 1 = số từ (giả sử 1 space giữa các từ).