В этом учебном пособии вы узнаете, как использовать функцию REGEXP_REPLACE Oracle/PLSQL с синтаксисом и примерами.
Описание
Функция Oracle/PLSQL REGEXP_REPLACE является расширением функции REPLACE. Эта функция, введенная в Oracle 10g, позволит вам заменить последовательность символов в строке другим набором символов, используя сопоставление шаблонов регулярных выражений.
Синтаксис
Синтаксис функции Oracle/PLSQL REGEXP_REPLACE :
Параметры или аргументы
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 раз. |
replacement_string
Необязательный. Соответствующие шаблоны в строке будут заменены на replace_string. Если параметр replacement_string опущен, то функция просто удаляет все совпадающие шаблоны и возвращает полученную строку.
start_position
Необязательный. Это позиция в строке, откуда начнется поиск. Если этот параметр опущен, по умолчанию он равен 1, который является первой позицией в строке.
nth_appearance
Необязательный. Это n-й вид шаблона в строке. Если этот параметр опущен, по умолчанию он равен 1, который является первым вхождением шаблона в строке. Если вы укажете 0 для этого параметра, все вхождения шаблона в строке будут заменены.
match_parameter
Необязательный. Это позволяет изменять поведение соответствия для условия REGEXP_REPLACE. Это может быть комбинацией следующих значений:
Значение | Описание |
---|---|
'c' | Выполняет чувствительное к регистру согласование. |
'i' | Выполняет не чувствительное к регистру согласование. |
'n' | Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы. |
'm' | Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке. |
'x' | Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ. |
Функция REGEXP_REPLACE возвращает строковое значение.
Примечание
- Если для параметра match_parameter имеются противоречивые значения, функция REGEXP_REPLACE будет использовать последнее значение.
- См. также функцию REPLACE.
Применение
Функция REGEXP_REPLACE может использоваться в следующих версиях Oracle/PLSQL:
- Oracle 12c, Oracle 11g, Oracle 10g
Пример совпадения с первым словом
Рассмотрим пример использования функции REGEXP_REPLACE для замены первого слова в строке.
Например:
1 2 3 |
SELECT REGEXP_REPLACE ('Bing is a great search engine.', '^(\S*)', 'Google') FROM dual; --Результат: 'Google is a great search engine.' |
Этот пример вернет 'Google is a great search engine.', потому что начало совпадения в начале строки, как указано символом ^, а затем найдет первое слово в соответствии с (\S*). Затем функция заменит это первое слово на 'Google'.
Пример совпадения цифр
Рассмотрим пример, как мы будем использовать функцию REGEXP_REPLACE для сопоставления шаблону цифровых символов.
Например:
1 2 3 |
SELECT REGEXP_REPLACE ('1, 4, и 10 числа для примера.', '\d', '@') FROM dual; --Результат: @, @, и @@ числа для примера. |
Этот пример заменит все числа в строке, как указано в шаблоне \d, на символ @.
Мы могли бы изменить наш шаблон для поиска только двухзначных чисел.
Например:
1 2 3 4 |
SELECT REGEXP_REPLACE ('1, 4, и 10 числа для примера', '(\d)(\d)', '@') FROM dual; --Результат: 1, 4, и @ числа для примера |
Этот пример заменит число, которое имеет две цифры, как указано в шаблоне (\d)(\d). В этом случае он пропустит числовые значения 2 и 5 и заменит 10 символом @.
Теперь рассмотрим, как мы будем использовать функцию REGEXP_REPLACE со столбцом таблицы для замены двухзначных чисел.
Например:
1 2 |
SELECT REGEXP_REPLACE (address, '(\d)(\d)', 'Str') FROM contacts; |
В этом примере мы заменим все двузначные значения поля address в таблице contacts на значение 'Str'.
Пример сопоставления нескольких альтернатив.
Следующий пример, который мы рассмотрим, включает использование | шаблон. | шаблон используется как «ИЛИ», чтобы указать несколько альтернатив.
Например:
1 2 3 |
SELECT REGEXP_REPLACE ('AeroSmith', 'a|e|i|o|u', 'R') FROM dual; --Результат: ARrRSmRth |
Этот пример вернет 'ARrRSmRth', потому что он ищет первую гласную (a, e, i, o или u) в строке. Поскольку мы не указали значение match_parameter, функция REGEXP_REPLACE будет выполнять поиск с учетом регистра, что означает, что 'A' в 'AeroSmith' не будет сопоставляться.
Мы могли бы изменить наш запрос, чтобы выполнить поиск без учета регистра следующим образом:
1 2 3 |
SELECT REGEXP_REPLACE ('AeroSmith', 'a|e|i|o|u', 'R', 1, 0, 'i') FROM dual; --Результат: RRrRSmRth |
Теперь, поскольку мы указали match_parameter = 'i', запрос заменит 'A' в строке. На этот раз 'A' в 'AeroSmith' сопоставится с шаблоном. Заметим также, что мы указали 5-й параметр как 0, чтобы были заменены все вхождения.
Теперь рассмотри, как вы будете использовать эту функцию со столбцом.
Итак, допустим, у нас есть таблица contact со следующими данными:
contact_id | last_name |
---|---|
1000 | AeroSmith |
2000 | Joy |
3000 | Scorpions |
Теперь давайте запустим следующий запрос:
1 2 |
SELECT contact_id, last_name, REGEXP_REPLACE (last_name, 'a|e|i|o|u', 'R', 1, 0, 'i') AS "New Name" FROM contacts; |
Запрос вернет следующие результаты:
contact_id | last_name | New Name |
---|---|---|
1000 | AeroSmith | RRrRSmRth |
2000 | Joy | JRy |
3000 | Scorpions | ScRrpRRns |
Пример совпадений на основе параметра nth_occurrence
Следующий пример, который мы рассмотрим, включает параметр nth_occurrence. Параметр nth_occurrence позволяет вам выбрать, какое вхождение шаблона вы хотите заменить в строке.
Первое вхождение
Рассмотрим, как заменить первое вхождение шаблона в строке.
Например:
1 2 3 4 |
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 1, 'i') FROM dual; --Результат: ScZrpions |
Этот пример заменит третий символ (‘e’) в 'Scorpions', потому что он заменяет первое вхождение гласного (a, e, i, o или u) в строке.
Второе вхождение
Затем мы выберем для второго вхождения шаблона в строку.
Например:
1 2 3 4 |
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 2, 'i') FROM dual; --Результат: ScorpZons |
Этот пример заменит шестой символ ('i') в 'Scorpions', потому что он заменяет второе вхождение гласного (a, e, i, o или u) в строке.
Третье вхождение
Например:
1 2 3 4 |
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 3, 'i') FROM dual; --Результат: ScorpiZns |
Этот пример заменит седьмой символ ('o') в 'Scorpions', потому что он заменяет третье вхождение гласного (a, e, i, o или u) в строке.