В MariaDB, REGEXP
Операторът се използва за определяне дали низ съответства на регулярен израз.
Ако низът съвпада с предоставения регулярен израз, резултатът е 1
, в противен случай е 0
.
Синтаксис
Синтаксисът е така:
expr REGEXP pat
Където expr
е входният низ и pat
е регулярният израз, срещу който тествате низа.
Примери
По-долу са дадени примери за използване на REGEXP
оператор с различни модели.
Основен регулярен израз
Нека започнем с най-простия пример. Най-простият регулярен израз, който можем да използваме, е този, който няма специални символи в него. Тук ние просто използваме низ. Ако някоя част от входния низ съвпада с този низ, тя връща съвпадение.
SELECT
'Corn' REGEXP 'Corn' AS "Corn",
'Acorn' REGEXP 'Corn' AS "Acorn",
'Corner' REGEXP 'Corn' AS "Corner",
'Cheese' REGEXP 'Corn' AS "Cheese";
Резултат:
+------+-------+-------+-------+| Царевица | Жълъд | Ъгъл | Сирене |+------+-------+-------+-------+| 1 | 1 | 1 | 0 |+-----+-------+-------+-------+
Съответствие с началото на низ
В този пример регулярният израз указва, че низът трябва да започва с Co
.
SELECT
'Corn' REGEXP '^Co' AS "Corn",
'Acorn' REGEXP '^Co' AS "Acorn",
'Cheese' REGEXP '^Co' AS "Cheese";
Резултат:
+------+-------+-------+| Царевица | Жълъд | Сирене |+------+-------+-------+| 1 | 0 | 0 |+-----+-------+-------+
Съответствие с края на низ
В този пример регулярният израз указва, че низът трябва да завършва с rn
.
SELECT
'Corn' REGEXP 'rn$' AS "Corn",
'Acorn' REGEXP 'rn$' AS "Acorn",
'Cheese' REGEXP 'rn$' AS "Cheese";
Резултат:
+------+-------+-------+| Царевица | Жълъд | Сирене |+------+-------+-------+| 1 | 1 | 0 |+-----+-------+-------+
Съответствие с всеки знак
.
знак съответства на всеки знак.
SELECT
'Corn' REGEXP '.' AS "Corn",
'Cheese' REGEXP '.' AS "Cheese",
'' REGEXP '.' AS "";
Резултат:
+------+-------+---+| Царевица | Сирене | |+-----+--------+---+| 1 | 1 | 0 |+------+--------+---+
Този знак обикновено се използва заедно с други знаци за определяне на допълнителни критерии. Например:
SELECT
'Corn' REGEXP '^C.rn$' AS "Corn",
'Crn' REGEXP '^C.rn$' AS "Crn";
Резултат:
+------+-----+| Царевица | Crn |+------+-----+| 1 | 0 |+------+-----+
Тук указваме, че низът трябва да започва с C
, че трябва да бъде последван от знак (всякакъв знак) и че трябва да завършва с rn
.
Имайте предвид, че този знак указва един екземпляр на знака. Ако искате да посочите няколко екземпляра (например ee
вместо само e
), ще трябва да добавите още .
знаци.
SELECT
'Tweet' REGEXP '^Tw..t$' AS "Tweet",
'Tweat' REGEXP '^Tw..t$' AS "Tweat",
'Tweet' REGEXP '^Tw.t$' AS "Tweet",
'Twit' REGEXP '^Tw..t$' AS "Twit";
Резултат:
+-------+-------+-------+-----+| Tweet | Tweat | Tweet | Туит |+-------+-------+-------+-----+| 1 | 1 | 0 | 0 |+-------+-------+-------+-----+
Друг начин да направите това е да посочите броя на събитията в къдрави скоби:
SELECT
'Tweet' REGEXP '^Tw.{2}t$' AS "Tweet",
'Tweat' REGEXP '^Tw.{2}t$' AS "Tweat",
'Tweet' REGEXP '^Tw.{1}t$' AS "Tweet",
'Twit' REGEXP '^Tw.{2}t$' AS "Twit";
Резултат:
+-------+-------+-------+-----+| Tweet | Tweat | Tweet | Туит |+-------+-------+-------+-----+| 1 | 1 | 0 | 0 |+-------+-------+-------+-----+
Ако обаче знаете знака, който търсите, можете да посочите този знак (вместо .
). символ), както е показано в следващия пример.
Съответствие на нула или повече екземпляри на конкретен символ
Можем да направим следното, за да посочим нула или повече екземпляри на e
знак:
SELECT
'Twet' REGEXP '^Twe*t$' AS "Twet",
'Tweet' REGEXP '^Twe*t$' AS "Tweet",
'Tweeet' REGEXP '^Twe*t$' AS "Tweeet",
'Twt' REGEXP '^Twe*t$' AS "Twt",
'Twit' REGEXP '^Twe*t$' AS "Twit",
'Twiet' REGEXP '^Twe*t$' AS "Twiet",
'Tweit' REGEXP '^Twe*t$' AS "Tweit";
Резултат:
+------+-------+-------+-----+-----+-------+- ------+| Туит | Tweet | Туит | Twt | Туит | Туит | Туит |+------+-------+-------+-----+------+-------+-- -----+| 1 | 1 | 1 | 1 | 0 | 0 | 0 |+------+-------+-------+-----+-----+-------+-- -----+
Първите четири съвпадат, но последните три не.
Съпоставете един или повече екземпляри на конкретен символ
Можем да модифицираме предишния пример, така че да получим съвпадение само ако едно или са намерени повече символи (предишният пример върна съвпадение, ако нула или повече са открити). За да направите това, ние просто използваме +
вместо *
:
SELECT
'Twet' REGEXP '^Twe+t$' AS "Twet",
'Tweet' REGEXP '^Twe+t$' AS "Tweet",
'Tweeet' REGEXP '^Twe+t$' AS "Tweeet",
'Twt' REGEXP '^Twe+t$' AS "Twt",
'Twit' REGEXP '^Twe+t$' AS "Twit",
'Twiet' REGEXP '^Twe+t$' AS "Twiet",
'Tweit' REGEXP '^Twe+t$' AS "Tweit";
Резултат:
+------+-------+-------+-----+-----+-------+- ------+| Туит | Tweet | Туит | Twt | Туит | Туит | Туит |+------+-------+-------+-----+------+-------+-- -----+| 1 | 1 | 1 | 0 | 0 | 0 | 0 |+------+-------+-------+-----+-----+-------+-- -----+
В този случай четвъртата дума връща различен резултат от предишния пример.
Съпоставете нула или един екземпляр на конкретен символ
Можем да модифицираме предишния пример, така че да получим съвпадение само на нула или един от желаните знаци. За да направим това, използваме ?
:
SELECT
'Twet' REGEXP '^Twe?t$' AS "Twet",
'Tweet' REGEXP '^Twe?t$' AS "Tweet",
'Tweeet' REGEXP '^Twe?t$' AS "Tweeet",
'Twt' REGEXP '^Twe?t$' AS "Twt",
'Twit' REGEXP '^Twe?t$' AS "Twit",
'Twiet' REGEXP '^Twe?t$' AS "Twiet",
'Tweit' REGEXP '^Twe?t$' AS "Tweit";
Резултат:
+------+-------+-------+-----+-----+-------+- ------+| Туит | Tweet | Туит | Twt | Туит | Туит | Туит |+------+-------+-------+-----+------+-------+-- -----+| 1 | 0 | 0 | 1 | 0 | 0 | 0 |+------+-------+-------+-----+-----+-------+-- -----+
Промяна
Можете да използвате |
знак, за да съответства на една или друга последователност от знаци:
SELECT
'Tweet' REGEXP 'Tw|et' AS "Tweet",
'For Let' REGEXP 'Tw|et' AS "For Let",
'Banana' REGEXP 'Tw|et' AS "Banana";
Резултат:
<пред>+-------+--------+-------+| Tweet | За Нека | Банан |+-------+--------+-------+| 1 | 1 | 0 |+-------+--------+-------+Ето още един пример, в който търся цели думи:
SELECT
'Cat' REGEXP 'Cat|Dog' AS "Cat",
'Dog' REGEXP 'Cat|Dog' AS "Dog",
'Doggone' REGEXP 'Cat|Dog' AS "Doggone",
'Banana' REGEXP 'Cat|Dog' AS "Banana";
Резултат:
+-----+-----+--------+-------+| Котка | Куче | Doggone | Банан |+-----+-----+--------+-------+| 1 | 1 | 1 | 0 |+-----+-----+--------+-------+
Все още получаваме съвпадение, дори когато нашият регулярен израз съвпада само с част от низа.
Съответствие на нула или повече екземпляри на последователност
Можете да използвате скоби заедно със звездичката ()*
за да посочите нула или повече екземпляри на последователност:
SELECT
'Banana' REGEXP '(an)*' AS "Banana",
'Land' REGEXP '(an)*' AS "Land",
'Cheese' REGEXP '(an)*' AS "Cheese";
Резултат:
<пред>+--------+------+-------+| Банан | Земя | Сирене |+--------+-----+-------+| 1 | 1 | 1 |+-------+------+-------+Друг пример:
SELECT
'Banana' REGEXP '^B(an)*d$' AS "Banana",
'Band' REGEXP '^B(an)*d$' AS "Band",
'Bald' REGEXP '^B(an)*d$' AS "Bald",
'Bad' REGEXP '^B(an)*d$' AS "Bad";
Резултат:
+--------+------+------+-----+| Банан | Банда | Плешив | Лошо |+--------+------+------+-----+| 0 | 1 | 0 | 0 |+-------+------+------+-----+
Повторение
Както се вижда в предишен пример, можете да използвате къдрави скоби, за да посочите повторение. Тази нотация предоставя по-общ начин за писане на регулярни изрази от някои от предишните примери:
SELECT
'Tweeet' REGEXP 'e{3}' AS "Tweeet",
'Tweet' REGEXP 'e{3}' AS "Tweet";
Резултат:
<пред>+--------+-------+| Туит | Tweet |+--------+-------+| 1 | 0 |+-------+-------+Обхват
Можете да използвате знака за тире, за да посочите диапазон. Ето пример, който определя диапазон от числа:
SELECT
'Tweet 123' REGEXP '[0-9]' AS "Tweet 123",
'Tweet ABC' REGEXP '[0-9]' AS "Tweet ABC";
Резултат:
<пред>+--------+-------+| Туит | Tweet |+--------+-------+| 1 | 0 |+-------+-------+И следният пример определя диапазон от букви:
SELECT
'Tweet 123' REGEXP '[A-Z]' AS "Tweet 123",
'ABC' REGEXP '[A-Z]' AS "ABC",
'123' REGEXP '[A-Z]' AS "123";
Резултат:
+-----------+-----+-----+| Туит 123 | ABC | 123 |+------+-----+-----+| 1 | 1 | 0 |+----------+-----+-----+
Ето какво се случва, ако ограничим диапазона от числа:
SELECT
'123' REGEXP '[1-3]' AS "123",
'012' REGEXP '[1-3]' AS "012",
'045' REGEXP '[1-3]' AS "045";
Резултат:
+-----+-----+-----+| 123 | 012 | 045 |+-----+-----+-----+| 1 | 1 | 0 |+-----+-----+-----+
Не е в обхват
Можем да използваме ^
символ, за да промените предишния пример, така че посоченият диапазон от знаци да бъде изключен:
SELECT
'123' REGEXP '[^1-3]' AS "123",
'012' REGEXP '[^1-3]' AS "012",
'045' REGEXP '[^1-3]' AS "045";
Резултат:
+-----+-----+-----+| 123 | 012 | 045 |+-----+-----+-----+| 0 | 1 | 1 |+-----+-----+-----+
В този случай получаваме обратен резултат на предишния пример.
Нулеви стойности
Ако изразът или моделът са null
, резултатът е null
:
SELECT
null REGEXP 'Corn' AS "Corn",
'Acorn' REGEXP null AS "Acorn",
null REGEXP null AS "Corner";
Резултат:
+------+-------+-------+| Царевица | Жълъд | Ъгъл |+------+-------+-------+| NULL | NULL | NULL |+------+-------+-------+