MySQL: Biểu thức chính quy trong MySQL
Giải phóng thời gian, khai phóng năng lực
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.
, expr
NOT REGEXP pat
expr
NOT RLIKE pat
Điều này giống như NOT (
expr
REGEXP pat
).
, expr
REGEXP pat
expr
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
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 Bananas
, Baaaaas
, Bs
, 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 a
, b
, c
, d
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 |
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 |
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
Giải phóng thời gian, khai phóng năng lực