Trong MariaDB, REGEXP_INSTR()
hàm trả về chỉ mục bắt đầu của một chuỗi con phù hợp với mẫu biểu thức chính quy.
Chỉ mục bắt đầu từ 1
. Nếu không có kết quả phù hợp, kết quả là 0
.
Cú pháp
Cú pháp như sau:
REGEXP_INSTR(subject, pattern)
Ở đâu subject
là chuỗi đầu vào và pattern
là mẫu biểu thức chính quy cho chuỗi con.
Lưu ý rằng, tại thời điểm viết bài, phiên bản REGEXP_INSTR()
của MariaDB chấp nhận ít đối số hơn REGEXP_INSTR()
của MySQL . Phiên bản của MySQL cho phép bạn cung cấp các đối số cho vị trí bắt đầu của tìm kiếm, vị trí xuất hiện để tìm kiếm, loại vị trí nào sẽ trả về, cũng như một cách để tinh chỉnh biểu thức chính quy.
Ví dụ
Đây là một ví dụ cơ bản:
SELECT REGEXP_INSTR('Cat', 'at');
Kết quả:
+---------------------------+ | REGEXP_INSTR('Cat', 'at') | +---------------------------+ | 2 | +---------------------------+
Trong trường hợp này, có một kết quả khớp và chuỗi con bắt đầu ở vị trí 2.
Không phù hợp
Dưới đây là một ví dụ mà không có kết quả phù hợp nào:
SELECT REGEXP_INSTR('Cat', '^at');
Kết quả:
+----------------------------+ | REGEXP_INSTR('Cat', '^at') | +----------------------------+ | 0 | +----------------------------+
Không có kết quả phù hợp nào nên kết quả là 0
. Không có kết quả khớp nào vì tôi đã chỉ định rằng chuỗi phải bắt đầu bằng chuỗi con.
Hãy thay đổi nó để nó không bắt đầu với chuỗi con đó:
SELECT REGEXP_INSTR('at', '^at');
Kết quả:
+---------------------------+ | REGEXP_INSTR('at', '^at') | +---------------------------+ | 1 | +---------------------------+
Phân biệt chữ hoa chữ thường
REGEXP_INSTR()
hàm tuân theo các quy tắc phân biệt chữ hoa chữ thường của phép đối chiếu hiệu quả. Đối sánh được thực hiện phân biệt chữ hoa chữ thường đối với các đối chiếu phân biệt chữ hoa chữ thường và phân biệt chữ hoa chữ thường đối với các đối chiếu phân biệt chữ hoa chữ thường và đối với dữ liệu nhị phân.
Đây là một ví dụ:
SELECT
REGEXP_INSTR('Cat', 'c') AS "My Default",
REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_ci, 'c') AS "Case Insensitive",
REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_cs, 'c') AS "Case Sensitive";
Kết quả:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | 1 | 1 | 0 | +------------+------------------+----------------+
Đối chiếu mặc định của tôi là không phân biệt chữ hoa chữ thường. Hai chuỗi còn lại buộc phải đối chiếu phân biệt chữ hoa chữ thường và phân biệt chữ hoa chữ thường.
Cung cấp BINARY
chuỗi cũng phân biệt chữ hoa chữ thường (xem bên dưới).
Chuỗi nhị phân
Theo mặc định, các vị trí được đo bằng ký tự thay vì byte. Tuy nhiên, bạn có thể truyền một ký tự nhiều byte được đặt thành BINARY
để lấy hiệu số theo byte nếu bạn cần.
Ví dụ:
SELECT
REGEXP_INSTR('© Cat', 'C') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";
Kết quả:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 4 | +-----------+--------+
Biểu tượng bản quyền sử dụng hai byte và do đó trong ví dụ này, chúng tôi nhận được kết quả là 4
khi truyền nó tới BINARY
, so với 3
mà chúng tôi nhận được theo cách khác.
Mặc dù lưu ý rằng việc chuyển một BINARY
chuỗi cũng ảnh hưởng đến độ phân biệt chữ hoa và chữ thường. Với BINARY
chuỗi, một ký tự viết hoa khác với ký tự viết thường của nó:
SELECT
REGEXP_INSTR('© Cat', 'c') AS "Character",
REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";
Kết quả:
+-----------+--------+ | Character | Binary | +-----------+--------+ | 3 | 0 | +-----------+--------+
Ở đây, tôi đã tìm kiếm một chữ thường c
thay vì viết hoa và BINARY
chuỗi không khớp.
Đối số rỗng
Chuyển null
vì bất kỳ đối số nào dẫn đến null
:
SELECT
REGEXP_INSTR(null, 'c') AS "1",
REGEXP_INSTR('Cat', null) AS "2",
REGEXP_INSTR(null, null) AS "3";
Kết quả:
+------+------+------+ | 1 | 2 | 3 | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Số lượng đối số sai
Truyền sai số đối số hoặc không có đối số, dẫn đến lỗi:
SELECT REGEXP_INSTR('Cat');
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'