Trong MySQL, hàm REGEXP_INSTR() trả về chỉ mục bắt đầu của chuỗi con khớp với mẫu biểu thức chính quy.

Chỉ số sẽ bắt đầu từ 1. Nếu không có kết quả trùng khớp khi chạy hàm REGEXP_INSTR thì kết quả là 0.

Cú pháp hàm như sau:

REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

Ở đây, expr là chuỗi đầu vào và pat là mẫu biểu thức chính quy cho chuỗi con.

Đối số tùy chọn pos cho phép bạn xác định vị trí trong chuỗi để bắt đầu tìm kiếm. Nếu không được chỉ định, tìm kiếm sẽ bắt đầu từ vị trí 1.

Đối số tùy chọn occurrence cho phép bạn xác định lần xuất hiện nào của kết quả khớp cần tìm kiếm. Nếu không được chỉ định, lần xuất hiện đầu tiên sẽ được sử dụng (lần xuất hiện 1).

Đối số tùy chọn return_option cho phép bạn xác định kiểu vị trí cần trả về. Nếu bạn sử dụng 0, nó sẽ trả về vị trí của ký tự đầu tiên trong chuỗi con khớp. Nếu bạn sử dụng 1, nó sẽ trả về vị trí của ký tự đầu tiên sau chuỗi con khớp. Nếu không được chỉ định, giá trị mặc định là 0.

Đối số tùy chọn match_type cho phép bạn tinh chỉnh biểu thức chính quy. Ví dụ, bạn có thể sử dụng đối số này để chỉ định tìm kiếm có phân biệt chữ hoa chữ thường hay không.

Ví dụ 1 – Cách sử dụng cơ bản

SELECT REGEXP_INSTR('Cat', 'at') Result;

Kết quả:

+--------+
| Result |
+--------+
|      2 |
+--------+

Trong trường hợp này có sự trùng khớp và chuỗi con bắt đầu ở vị trí 2.

Ví dụ 2 – Không có kết quả khớp

Dưới đây là một ví dụ mà không có kết quả khớp:

SELECT REGEXP_INSTR('VNEngineer', '^En') Result;

Result:

+--------+
| Result |
+--------+
|      0 |
+--------+

Không có kết quả khớp, vì vậy kết quả là 0. Không có kết quả khớp là do tôi đã chỉ định rằng chuỗi phải bắt đầu bằng chuỗi con đó.

Hãy thay đổi nó để nó bắt đầu bằng chuỗi con đó:

SELECT REGEXP_INSTR('VNEngineer', '^VN') Result;

Result:

+--------+
| Result |
+--------+
|      1 |
+--------+

Ví dụ 3 – Đối số pos

Dưới đây là ví dụ về việc chỉ định vị trí bắt đầu:

SELECT REGEXP_INSTR('VNE VNEngineer', 'VNE', 2) Result;

Kết quả:

+--------+
| Result |
+--------+
|      5 |
+--------+

Vì vậy, chúng ta nhận được chỉ số của lần xuất hiện thứ hai.

Lưu ý rằng chỉ số vẫn bắt đầu đếm từ vị trí 1, bất kể bạn chỉ định vị trí bắt đầu ở đâu.

Ví dụ sau đây thể hiện điều này rõ hơn:

SELECT 
  REGEXP_INSTR('VNE VNEngineer', 'VNE', 2) AS 'Pos 2', 
  REGEXP_INSTR('VNE VNEngineer', 'VNE', 3) AS 'Pos 3', 
  REGEXP_INSTR('VNE VNEngineer', 'VNE', 5) AS 'Pos 5';

Kết quả:

+-------+-------+-------+
| Pos 2 | Pos 3 | Pos 5 |
+-------+-------+-------+
|     5 |     5 |     5 |
+-------+-------+-------+

Tất nhiên, tùy thuộc vào mẫu biểu thức chính quy của bạn, điều này có thể trả về chỉ số của các chuỗi con hoàn toàn khác nhau. Ví dụ:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1) 'Pos 1',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2) 'Pos 2',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 6) 'Pos 6';
+-------+-------+-------+
| Pos 1 | Pos 2 | Pos 6 |
+-------+-------+-------+
|     1 |     5 |    16 |
+-------+-------+-------+

Chúng ta có thể kiểm tra các chuỗi con bằng hàm REGEXP_SUBSTR():

SELECT 
  REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 1) 'Pos 1',
  REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 2) 'Pos 2',
  REGEXP_SUBSTR('Cat City is SO Cute!', 'C.t', 6) 'Pos 6';
+-------+-------+-------+
| Pos 1 | Pos 2 | Pos 6 |
+-------+-------+-------+
| Cat   | Cit   | Cut   |
+-------+-------+-------+

Ví dụ 4 – Vị trí bắt đầu với Đối số occurrence

Dưới đây là ví dụ về việc sử dụng đối số occurrence. Trong tất cả các trường hợp, chúng ta bắt đầu từ vị trí 1:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 1) 'Occurrence 1',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 2) 'Occurrence 2',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 1, 3) 'Occurrence 3';
+--------------+--------------+--------------+
| Occurrence 1 | Occurrence 2 | Occurrence 3 |
+--------------+--------------+--------------+
|            1 |            5 |           16 |
+--------------+--------------+--------------+

Kết quả:

Tuy nhiên, nếu chúng ta bắt đầu từ một vị trí khác, kết quả sẽ khác:

SELECT 
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 1) 'Occurrence 1',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 2) 'Occurrence 2',
  REGEXP_INSTR('Cat City is SO Cute!', 'C.t', 2, 3) 'Occurrence 3';

Kết quả:

+--------------+--------------+--------------+
| Occurrence 1 | Occurrence 2 | Occurrence 3 |
+--------------+--------------+--------------+
|            5 |           16 |            0 |
+--------------+--------------+--------------+

Điều này xảy ra vì vị trí bắt đầu của chúng ta nằm sau khi lần xuất hiện đầu tiên bắt đầu. Do đó, lần xuất hiện thứ 2 trở thành lần xuất hiện thứ 1, và lần xuất hiện thứ 3 trở thành lần xuất hiện thứ 2. Và vì không còn lần xuất hiện nào nữa, kết quả của lần xuất hiện thứ 3 là âm (tức là không có lần xuất hiện thứ 3).