MySQL: Biểu thức chính quy trong MySQL


Đăng ký nhận thông báo về những video mới nhất

Biểu thức chính quy (Regular Expression) là một cách mạnh mẽ để chỉ định mẫu cho tìm kiếm phức tạp. Phần này thảo luận về các toán tử có sẵn cho khớp biểu thức chính quy và minh họa, với các ví dụ, một số ký tự và cấu trúc đặc biệt có thể được sử dụng cho các hoạt động biểu thức chính quy.

Toán tử biểu thức chính quy

expr NOT REGEXP patexpr NOT RLIKE pat

Điều này giống như  NOT (expr REGEXP pat).

expr REGEXP patexpr RLIKE pat

Trả về 1 nếu chuỗi  expr khớp với biểu thức chính quy được chỉ định bởi mẫu  pat, 0 nếu không. Nếu một trong hai  expr hoặc  pat là  NULL, giá trị trả về là  NULL.

RLIKE là một từ đồng nghĩa với  REGEXP, được cung cấp để  mSQL tương thích.

Mẫu có thể là một biểu thức chính quy mở rộng, cú pháp được thảo luận trong  Cú pháp biểu thức chính quy . Các mẫu không cần phải là một chuỗi chữ. Ví dụ, nó có thể được chỉ định làm biểu thức chuỗi hoặc cột bảng.

Các hoạt động biểu thức chính quy sử dụng bộ ký tự và đối chiếu biểu thức chuỗi và đối số mẫu khi quyết định loại ký tự và thực hiện so sánh. Nếu các đối số có các bộ ký tự hoặc các đối chiếu khác nhau, các quy tắc cưỡng chế sẽ được áp dụng. Nếu một trong hai đối số là một chuỗi nhị phân, thì các đối số được xử lý theo kiểu phân biệt chữ hoa chữ thường dưới dạng chuỗi nhị phân.

mysql> SELECT 'Michael!' REGEXP '.*'; # tìm thấy
mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line'; # không tìm thấy
mysql> SELECT 'a' REGEXP '^[a-d]'; # tìm thấy
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A'; không tìm thấy

Cú pháp biểu thức chính quy

Một biểu thức chính quy mô tả một tập hợp các chuỗi. Biểu thức chính quy đơn giản nhất là biểu thức không có ký tự đặc biệt trong đó. Ví dụ, biểu thức chính quy  hello khớp với  hello và không có gì khác.

Các biểu thức chính quy không cần thiết sử dụng một số cấu trúc đặc biệt để chúng có thể khớp với nhiều hơn một chuỗi. Ví dụ, biểu thức chính quy  hello|world chứa toán tử xen kẽ | và khớp với  hello hoặc  world.

Biểu thức chính quy  B[an]*s phù hợp với các chuỗi BananasBaaaaasBs, và bất kỳ chuỗi nào bắt đầu với một  B, kết thúc với một  s, và có chứa bất kỳ số lượng ký tự a hoặc n.

Biểu thức chính quy cho toán tử REGEXP có thể sử dụng bất kỳ ký tự và cấu trúc đặc biệt nào sau đây:

  • ^

Khớp với phần đầu của một chuỗi.

mysql> SELECT 'fo\nfo' REGEXP '^fo$'; #khớp
mysql> SELECT 'fofo' REGEXP '^fo'; #không khớp
  • $

Nối phần cuối của chuỗi.

mysql> SELECT 'fo\no' REGEXP '^fo\no$'; #khớp
mysql> SELECT 'fo\no' REGEXP '^fo$'; #không khớp
  • .

Ứng với 1 ký tự bất kỳ.

mysql> SELECT 'fofo' REGEXP '^f.*$'; #khớp
mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$'; #khớp
  • a*

Ứng với có từ 0 ký tự a.

mysql> SELECT 'Ban' REGEXP '^Ba*n'; #khớp
mysql> SELECT 'Baaan' REGEXP '^Ba*n'; #khớp
mysql> SELECT 'Bn' REGEXP '^Ba*n'; #khớp
  • a+

Ứng với có từ 1 ký tự a.

mysql> SELECT 'Ban' REGEXP '^Ba+n'; #khớp
mysql> SELECT 'Bn' REGEXP '^Ba+n'; #không khớp
  • a?

Ứng với có 0 hoặc 1 ký tự a.

mysql> SELECT 'Bn' REGEXP '^Ba?n'; #khớp
mysql> SELECT 'Ban' REGEXP '^Ba?n'; #khớp
mysql> SELECT 'Baan' REGEXP '^Ba?n'; #không khớp
  • de|abc

Ứng với có de hoặc abc.

mysql> SELECT 'pi' REGEXP 'pi|apa'; #khớp
mysql> SELECT 'axe' REGEXP 'pi|apa'; #không khớp
mysql> SELECT 'apa' REGEXP 'pi|apa'; #khớp
mysql> SELECT 'apa' REGEXP '^(pi|apa)$'; #khớp
mysql> SELECT 'pi' REGEXP '^(pi|apa)$'; #khớp
mysql> SELECT 'pix' REGEXP '^(pi|apa)$'; #không khớp
  • (abc)*

Ứng với có từ 0 chuỗi abc.

mysql> SELECT 'pi' REGEXP '^(pi)*$'; #khớp
mysql> SELECT 'pip' REGEXP '^(pi)*$'; #không khớp
mysql> SELECT 'pipi' REGEXP '^(pi)*$'; #khớp
  • {m}{m,n}

Ứng với có từ m ký tự, hoặc có từ m đến n ký tự. Các trường hợp cụ thể:

  • a{2}

Ứng với có từ 2 ký tự a

  • a{2,10}

Ứng với có từ 2 đến 10 ký tự a.

  • a*

Có thể viết là  a{0,}.

  • a+

Có thể viết là  a{1,}.

  • a?

Có thể viết là  a{0,1}.

m và  n thường phải nằm trong phạm vi từ 0 đến 255. Các ví dụ:

mysql> SELECT 'abcde' REGEXP 'a[bcd]{2}e'; #không khớp
mysql> SELECT 'abcde' REGEXP 'a[bcd]{3}e'; #khớp
mysql> SELECT 'abcde' REGEXP 'a[bcd]{1,10}e'; #khớp
  • [a-dX][^a-dX]

Phù hợp với bất kỳ ký tự đó là (hoặc không, nếu  ^ được sử dụng) hoặc  abcd hoặc  X. Một ký tự - nằm giữa hai ký tự khác tạo thành một phạm vi khớp với tất cả các ký tự từ ký tự đầu tiên đến ký tự thứ hai. Ví dụ,  [0-9] phù hợp với bất kỳ chữ số thập phân.

mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]'; #khớp
mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$'; #không khớp
mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]+$'; #không khớp
mysql> SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$'; #không khớp
mysql> SELECT 'gheis' REGEXP '^[^a-dXYZ]+$'; #khớp
mysql> SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$'; #khớp
  • [.characters.]

Trong một biểu thức ngoặc (viết bằng cách sử dụng [ và ]), khớp với chuỗi ký tự của phần tử đối chiếu đó. characters là một ký tự đơn hoặc một ký tự tương ứng newline. Bảng sau liệt kê các ký tự được phép.

Bảng sau đây cho thấy tên nhân vật được phép và các ký tự mà chúng khớp. Đối với các ký tự được đưa ra dưới dạng giá trị số, các giá trị được biểu thị bằng số bát phân.

Tên Ký tự Tên Ký tự
NUL 0 SOH 001
STX 002 ETX 003
EOT 004 ENQ 005
ACK 006 BEL 007
alert 007 BS 010
backspace '\b' HT 011
tab '\t' LF 012
newline '\n' VT 013
vertical-tab '\v' FF 014
form-feed '\f' CR 015
carriage-return '\r' SO 016
SI 017 DLE 020
DC1 021 DC2 022
DC3 023 DC4 024
NAK 025 SYN 026
ETB 027 CAN 030
EM 031 SUB 032
ESC 033 IS4 034
FS 034 IS3 035
GS 035 IS2 036
RS 036 IS1 037
US 037 space ' '
exclamation-mark '!' quotation-mark '"'
number-sign '#' dollar-sign '$'
percent-sign '%' ampersand '&'
apostrophe '\'' left-parenthesis '('
right-parenthesis ')' asterisk '*'
plus-sign '+' comma ','
hyphen '-' hyphen-minus '-'
period '.' full-stop '.'
slash '/' solidus '/'
zero '0' one '1'
two '2' three '3'
four '4' five '5'
six '6' seven '7'
eight '8' nine '9'
colon ':' semicolon ';'
less-than-sign '<' equals-sign '='
greater-than-sign '>' question-mark '?'
commercial-at '@' left-square-bracket '['
backslash '\\' reverse-solidus '\\'
right-square-bracket ']' circumflex '^'
circumflex-accent '^' underscore '_'
low-line '_' grave-accent '`'
left-brace '{' left-curly-bracket '{'
vertical-line '|' right-brace '}'
right-curly-bracket '}' tilde '~'
DEL 177    
Ví dụ:
mysql> SELECT '~' REGEXP '[[.~.]]'; #khớp
mysql> SELECT '~' REGEXP '[[.tilde.]]'; #khớp
  • [=character_class=]

Trong một biểu thức ngoặc (=[ và ]),  [=character_class=] đại diện cho một lớp tương đương. Nó phù hợp với tất cả các ký tự có cùng giá trị đối chiếu, bao gồm cả chính nó. Ví dụ, nếu  o và  (+) là những thành viên của một lớp tương đương, thì [[=o=]][[=(+)=]], và [o(+)] tất cả đều tương đương. Một lớp tương đương có thể không được sử dụng làm điểm cuối của một phạm vi.

  • [:character_class:]

Trong một biểu thức ngoặc ([ và ]), [:character_class:] đại diện cho một lớp ký tự khớp với tất cả các ký tự thuộc lớp đó. Bảng sau liệt kê các tên lớp tiêu chuẩn. Mỗi miền địa phương cụ thể có thể cung cấp tên lớp khác. Một lớp ký tự có thể không được sử dụng làm điểm cuối của một phạm vi.

Tên lớp ký tự Ý nghĩa
alnum Ký tự chữ và số
alpha Ký tự chữ cái
blank Ký tự khoảng trắng
cntrl Điều khiển nhân vật
digit Chữ số ký tự
graph Nhân vật đồ họa
lower Chữ cái viết thường
print Nhân vật đồ họa hoặc không gian
punct Ký tự dấu chấm câu
space Không gian, tab, dòng mới, và vận chuyển trở lại
upper Ký tự chữ cái in hoa
xdigit Ký tự chữ số thập lục phân
Ví dụ:
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; #khớp
mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; #không khớp
  • [[:<:]][[:>:]]

Những điểm đánh dấu là viết tắt của ranh giới từ. Chúng phù hợp với đầu và cuối của từ tương ứng. Một từ là một chuỗi các ký tự từ không được theo trước hoặc theo sau bởi các ký tự từ. Một ký tự từ là một ký tự chữ và số trong lớp  alnum hoặc dấu gạch dưới ( _).

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; #khớp
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; #không khớp

Nếu muốn chuyển ký tự đặc biệt của biểu thức chính quy thành ký tự thường thì ta đặt trước ký tự đặc biệt đó 2 dấu gạch chéo ngược (\). Ví dụ, để khớp với chuỗi 1+2, chỉ có biểu thức chính quy cuối cùng sau đây là phù hợp:

mysql> SELECT '1+2' REGEXP '1+2'; #không khớp
mysql> SELECT '1+2' REGEXP '1\+2'; #không khớp
mysql> SELECT '1+2' REGEXP '1\\+2'; #khớp

Nếu bạn có điều thắc mắc, bạn hãy comment cho V1Study để được giải đáp.
Bài viết này được chia sẻ bởi LongDT. Nếu bạn muốn chia sẻ bài viết, bạn hãy Đăng ký làm thành viên!
« Prev
Next »
Copied !!!