В этом учебном пособии вы узнаете, как использовать функцию REGEXP_COUNT Oracle/PLSQL с синтаксисом и примерами.
Описание
Функция Oracle/PLSQL REGEXP_COUNT подсчитывает количество вхождений шаблона в строку. Эта функция, введенная в Oracle 11g, позволит вам подсчитать количество раз, когда подстрока встречается в строке с использованием сопоставления шаблонов регулярных выражений.
Синтаксис
Синтаксис функции Oracle/PLSQL REGEXP_COUNT:
Параметры или аргументы
string
Строка для поиска. Строкой могут быть CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB или NCLOB.
pattern
Шаблон. Регулярное выражение для сопоставления. Это может быть комбинацией следующих значений:
| Значение | Описание |
|---|---|
| ^ | Соответствует началу строки. При использовании match_parameter с m, соответствует началу строки в любом месте в пределах выражения. |
| $ | Соответствует концу строки. При использовании match_parameter с m, соответствует концу строки в любом месте в пределах выражения. |
| * | Соответствует нолю или более вхождений. |
| + | Соответствует одному или более вхождений. |
| ? | Соответствует нолю или одному вхождению. |
| . | Соответствует любому символу, кроме NULL. |
| | | Используется как "OR", чтобы указать более одной альтернативы. |
| [ ] | Используется для указания списка совпадений, где вы пытаетесь соответствовать любому из символов в списке. |
| [^ ] | Используется для указания списка nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке. |
| ( ) | Используется для групповых выражений в качестве подвыражений. |
| {m} | Соответствует m раз. |
| {m,} | Соответствие как минимум m раз. |
| {m,n} | Соответствие как минимум m раз, но не более n раз. |
| \n | n представляет собой число от 1 до 9. Соответствует n-му подвыражению находящемуся в ( ) перед \n. |
| [..] | Соответствует одному сопоставлению элемента, который может быть более одного символа. |
| [::] | Соответствует классу символов. |
| [==] | Соответствует классу эквивалентности |
| \d | Соответствует цифровому символу. |
| \D | Соответствует не цифровому символу. |
| \w | Соответствует текстовому символу. |
| \W | Соответствует не текстовому символу. |
| \s | Соответствует символу пробел. |
| \S | Соответствует не символу пробел. |
| \A | Соответствует началу строки или соответствует концу строки перед символом новой строки. |
| \Z | Соответствует концу строки. |
| *? | Соответствует предыдущему шаблону ноль или более вхождений. |
| +? | Соответствует предыдущему шаблону один или более вхождений. |
| ?? | Соответствует предыдущему шаблону ноль или одному вхождению. |
| {n}? | Соответствует предыдущему шаблону n раз. |
| {n,}? | Соответствует предыдущему шаблону, по меньшей мере n раз. |
| {n,m}? | Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз. |
start_position
Необязательный. Это позиция в строке, откуда начнется поиск. Если этот параметр опущен, по умолчанию он равен 1, который является первой позицией в строке.
match_parameter
Необязательный. Он позволяет изменять поведение соответствия для функции REGEXP_COUNT. Это может быть комбинацией следующих значений:
| Значение | Описание |
|---|---|
| 'c' | Выполняет чувствительное к регистру согласование. |
| 'i' | Выполняет не чувствительное к регистру согласование. |
| 'n' | Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы. |
| 'm' | Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке. |
| 'x' | Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ. |
Функция REGEXP_COUNT возвращает числовое значение.
Примечание
- Если для параметра match_parameter имеются конфликтующие значения, функция REGEXP_COUNT будет использовать последнее значение.
- Если функция REGEXP_COUNT не обнаруживает какого-либо вхождение шаблона, она вернет 0.
Применение
Функцию REGEXP_COUNT можно использовать в следующих версиях Oracle / PLSQL:
- Oracle 12c, Oracle 11g
Пример совпадения единичного символа
Рассмотрим простейший пример. Давайте посчитаем, сколько раз символ 'a' появляется в строке.
Например:
|
1 2 3 4 |
SELECT REGEXP_COUNT ('Aller Anfang ist schwer', 'a') FROM dual; --Результат: 1 |
Этот пример вернет 1, потому что он подсчитывает количество вхождений 'a' в строке. Так как мы не указали значение match_parameter, то функция REGEXP_COUNT выполнит поиск с учетом регистра, что означает, что символ 'A' не будет включен в счет.
Если бы мы хотели включить в наш результат как 'a', так и ‘A’, и выполнить поиск без учета регистра, то изменим наш запрос следующим образом:
|
1 2 3 4 |
SELECT REGEXP_COUNT ('Aller Anfang ist schwer', 'a', 1, 'i') FROM dual; --Результат: 3 |
Теперь, поскольку мы предоставили start_position = 1 и match_parameter = 'i', то запрос в качестве результата вернет 3. На этот раз значения 'a' и 'A' будут включены в счет.
Если бы мы хотели подсчитать количество 'a' в столбце, мы могли бы попробовать что-то вроде этого:
|
1 2 |
SELECT REGEXP_COUNT (last_name, 'a', 1, 'i') AS total FROM contacts; |
Этот запрос будет подсчитывать количество значений 'a' или 'A' в поле last_name из таблицы contacts.
Пример совпадения нескольких символов
Рассмотрим, как мы будем использовать функцию REGEXP_COUNT для соответствия многосимвольному шаблону.
Например:
|
1 2 3 4 |
SELECT REGEXP_COUNT ('Gute Saat, gute Ernte', 'gute', 1, 'i') FROM dual; --Результат: 2 |
В этом примере будет возвращено количество раз, когда в строке появляется слово 'gute'. Поиск выполняется без учета регистра, поэтому в результате 2 вхождения.
|
1 2 3 4 |
SELECT REGEXP_COUNT ('Gute Saat, gute Ernte', 'gute', 5, 'i') FROM dual; --Результат: 1 |
В этом примере будет возвращено количество раз, когда слово 'gute' появляется в строке, начиная с позиции 5. В этом случае результат = 1, потому что перед поиском шаблона он пропустит первые 4 символа в строке.
Теперь давайте посмотрим, как мы будем использовать функцию REGEXP_COUNT со столбцом таблицы и искать несколько символов.
Например:
|
1 2 3 4 |
SELECT REGEXP_COUNT (other_comments, 'the', 1, 'i') FROM contacts; --Результат: 3 |
В этом примере мы будем подсчитывать количество появления «the» в поле other_comments в таблице contacts.
Пример сопоставления нескольких альтернатив.
Следующий пример, который мы рассмотрим, включает использование | pattern. | pattern используется как «ИЛИ», чтобы указать несколько альтернатив.
Например:
|
1 2 3 4 |
SELECT REGEXP_COUNT ('AeroSmith', 'a|e|i|o|u') FROM dual; --Результат: 3 |
Этот пример вернет 3, потому что он подсчитывает количество гласных (a, e, i, o или u) в строке 'AeroSmith'. Поскольку мы не указали значение match_parameter, функция REGEXP_COUNT будет выполнять поиск с учетом регистра, что означает, что ‘A’ в 'AeroSmith' не будет считаться.
Мы могли бы изменить наш запрос следующим образом, чтобы выполнить поиск без учета регистра следующим образом:
|
1 2 3 4 |
SELECT REGEXP_COUNT ('AeroSmith', 'a|e|i|o|u', 1, 'i') FROM dual; --Результат: 4 |
Теперь, поскольку мы указали start_position = 1 и match_parameter = 'i', запрос вернет в качестве результата 4. На этот раз ‘A’ в 'AeroSmith' будет включена в счет.
Теперь давайте посмотрим, как мы будем использовать эту функцию со столбцом.
Итак, допустим, у нас есть таблица контактов со следующими данными:
| contact_id | last_name |
|---|---|
| 1000 | AeroSmith |
| 2000 | Joy |
| 3000 | Scorpions |
Теперь давайте запустим следующий запрос:
|
1 2 |
SELECT contact_id, last_name, REGEXP_COUNT (last_name, 'a|e|i|o|u', 1, 'i') AS total FROM contacts; |
Результаты, которые будут возвращены запросом:
| contact_id | last_name | total |
|---|---|---|
| 1000 | AeroSmith | 4 |
| 2000 | Joy | 1 |
| 3000 | Scorpions | 3 |