在 Oracle 数据库中使用正则表达式

在 Oracle 数据库中使用正则表达式

  • 0. 引言
  • 1. 什么是正则表达式?
  • 2. Oracle 数据库正则表达式支持
  • 3. 用于正则表达式的 Oracle 数据库 SQL 函数
  • 4. 正则表达式中支持的元字符
  • 5. 构建正则表达式

0. 引言

本文介绍 Oracle 数据库的正则表达式支持。本文涵盖以下主题:

  • 什么是正则表达式?
  • Oracle 数据库正则表达式支持
  • 用于正则表达式的 Oracle 数据库 SQL 函数
  • 正则表达式中支持的元字符
  • 构建正则表达式

1. 什么是正则表达式?

正则表达式使用标准化语法约定指定要在字符串数据中搜索的模式。正则表达式可以指定复杂的字符序列模式。例如,以下正则表达式:

a(b|c)d

搜索模式:“a”,后跟“b”或“c”,最后跟“d”。此正则表达式同时匹配“abd”和“acd”。

正则表达式使用两种类型的字符指定:

  • 元字符——指定执行搜索的算法的运算符。
  • 文字——要搜索的实际字符。

2. Oracle 数据库正则表达式支持

Oracle 数据库实现了符合 POSIX 扩展正则表达式 (ERE) 规范的正则表达式支持。

正则表达式支持是通过一组 Oracle 数据库 SQL 函数实现的,这些函数允许您搜索和操作字符串数据。您可以在任何使用 Oracle 数据库 SQL 的环境中使用这些函数。有关详细信息,请参阅本章后面的“用于正则表达式的 Oracle 数据库 SQL 函数”。

Oracle 数据库支持正则表达式中使用的一组常见元字符。支持的元字符和相关功能的行为在“正则表达式中支持的元字符”中进行了描述。

业界支持正则表达式的工具之间对元字符的解释有所不同。如果您要将正则表达式从其他环境移植到 Oracle 数据库,请确保正则表达式语法受支持并且行为符合您的预期。

3. 用于正则表达式的 Oracle 数据库 SQL 函数

数据库提供了一组 SQL 函数,允许您使用正则表达式搜索和操作字符串。您可以在任何保存字符数据的数据类型(例如 CHAR、NCHAR、CLOB、NCLOB、NVARCHAR2 和 VARCHAR2)上使用这些函数。

正则表达式必须用单引号括起来。这样做可以确保 SQL 函数解释整个表达式,并可以提高代码的可读性。

下表给出了每个正则表达式函数的简要说明。

SQL FunctionDescription
REGEXP_LIKE该函数在字符列中搜索模式。在查询的 WHERE 子句中使用此函数可返回与您指定的正则表达式匹配的行。
REGEXP_REPLACE此函数在字符列中搜索模式,并用您指定的模式替换每次出现的该模式。
REGEXP_INSTR该函数在字符串中搜索给定的正则表达式模式。您指定要查找的出现位置以及搜索的起始位置。此函数返回一个整数,指示在字符串中找到匹配项的位置。
REGEXP_SUBSTR此函数返回与您指定的正则表达式模式匹配的实际子字符串。

4. 正则表达式中支持的元字符

下表列出了支持在传递给 SQL 正则表达式函数的正则表达式中使用的元字符。有关这些元字符的匹配行为的详细信息在“构造正则表达式”中给出。

Metacharacter SyntaxOperator NameDescription
.任意字符——点匹配任意字符
+一个或多个——加上量词匹配前面的子表达式的一次或多次出现
?零或一——问号量词匹配前面的子表达式零次或一次出现
*零或更多——星量词匹配前面的子表达式零次或多次出现
{m}间隔–精确计数精确匹配前面子表达式的 m 次出现
{m,}间隔——至少计数匹配至少 m 次出现的前面的子表达式
{m,n}间隔–计数之间匹配至少 m ,但不超过 n 出现的前面的子表达式
[ … ]匹配字符列表匹配列表中的任意字符 …
[^ … ]不匹配的字符列表匹配列表中不存在的任何字符 …
|Or‘a|b’ 匹配字符“a”或“b”。
( … )子表达式或分组将表达式 … 视为一个单元。子表达式可以是文字字符串或包含运算符的复杂表达式。
\n子表达式或分组将表达式 … 视为一个单元。子表达式可以是文字字符串或包含运算符的复杂表达式。
\转义字符将表达式中的后续元字符视为文字。
^线锚点的起点仅当后续表达式出现在行首时才匹配它。
$行末锚点仅当前面的表达式出现在行尾时才匹配它。
[:class:]POSIX 字符类匹配属于指定字符 class 的任何字符。可以在任何列表表达式中使用。
[.element.]POSIX 整理序列指定要在正则表达式中使用的整理顺序。您使用的 element 必须是当前区域设置中定义的整理序列。
[=character=]POSIX 字符等效类匹配与您指定的 character 具有相同基本字符的字符。

5. 构建正则表达式

使用正则表达式进行基本字符串匹配

可以使用正则表达式执行的最简单的匹配是基本字符串匹配。对于这种类型的匹配,正则表达式是不带元字符的文字字符串。例如,要查找序列“abc”,请指定正则表达式:

abc

子表达式的正则表达式运算

如前所述,正则表达式是使用元字符和文字构造的。对单个文字进行操作的元字符,例如“+”和“?”还可以对文字序列或整个表达式进行操作。为此,您可以使用分组运算符将序列或子表达式括起来。有关分组的更多信息,请参阅“子表达式”。

正则表达式运算符和元字符用法

匹配任何字符–点,点运算符 ‘.’ 匹配当前字符集中的任何单个字符。例如,要查找序列(“a”,后跟任何字符,后跟“c”),请使用以下表达式:

a.c

该表达式匹配以下所有序列:

abc
adc
a1c
a&c

表达式不匹配:

abb

一个或多个——加上,一个或多个运算符 ‘+’ 与前面的表达式的一个或多个匹配项相匹配。例如,要查找字符“a”的一次或多次出现,可以使用正则表达式:

a+

该表达式匹配以下所有内容:

a
aa
aaa

表达式不匹配:

bbb

零或一——问号运算符,问号与前面的字符或子表达式的零次或一次(并且仅一次)匹配。您可以将此运算符视为指定源文本中可选的表达式。例如,要查找“a”,可选地后跟“b”,然后后跟“c”,您可以使用以下正则表达式:

ab?c

该表达式匹配:

abc
ac

表达式不匹配:

adc
abbc

零个或更多——星星,零个或多个运算符 ‘*’ 匹配零个或多次出现的前面的字符或子表达式。例如,要查找“a”,后跟零个或多次出现的“b”,然后是“c”,请使用正则表达式:

ab*c

该表达式匹配以下所有序列:

ac
abc
abbc
abbbbc

表达式不匹配:

adc

间隔–精确计数,精确计数间隔运算符用大括号内的单个数字指定。您可以使用此运算符来搜索前面的字符或子表达式的确切出现次数。例如,要查找“a”恰好出现 5 次的位置,您可以指定正则表达式:

a{5}

该表达式匹配:

aaaaa

表达式不匹配:

aaaa

间隔——至少计数,您可以使用至少计数间隔运算符来搜索前面的字符或子表达式出现指定次数或多次的情况。例如,要查找“a”至少出现 3 次的位置,可以使用正则表达式:

a{3,}

该表达式匹配以下所有内容:

aaa
aaaaa

表达式不匹配:

aa

间隔–计数之间,您可以使用计数间隔运算符来搜索指定范围内的出现次数。例如,要查找“a”出现至少 3 次但不超过 5 次的位置,可以使用以下正则表达式:

a{3,5}

该表达式匹配以下所有序列:

aaa
aaaa
aaaaa

表达式不匹配:

aa

匹配字符列表,您可以使用匹配字符列表来搜索列表中出现的任何字符。例如,要查找“a”、“b”或“c”,请使用以下正则表达式:

[abc]

此表达式匹配以下每个字符串中的第一个字符:

at
bet
cot

表达式不匹配:

def

字符列表中允许使用以下正则表达式运算符,字符列表中包含的任何其他元字符都会失去其特殊含义(被视为文字):

  • 范围运算符 ‘-’
  • POSIX 字符类 [: :]
  • POSIX 整理序列 [. .]
  • POSIX 字符等效类 [= =]

不匹配的字符列表,使用非匹配字符列表指定您不想匹配的字符。不在非匹配字符列表中的字符将作为匹配项返回。例如,要从搜索结果中排除字符“a”、“b”和“c”,请使用以下正则表达式:

[^abc]

此表达式匹配以下字符串中的字符“d”和“g”:

abcdef
ghi

表达式不匹配:

abc

与匹配字符列表一样,非匹配字符列表中允许使用以下正则表达式运算符(字符列表中包含的任何其他元字符都将被忽略):

  • 范围运算符 ‘-’
  • POSIX 字符类 [: :]
  • POSIX 整理序列 [. .]
  • POSIX 字符等效类 [= =]

例如,以下正则表达式从搜索结果中排除“a”和“i”之间的任何字符:

[^a-i]

此表达式与以下字符串中的字符“j”和“l”匹配:

hijk
lmn

表达式与字符不匹配:

abcdefghi

使用 Or 运算符 ‘|’ 指定替代表达式。例如,要匹配“a”或“b”,请使用以下正则表达式:

a|b

子表达式,您可以使用子表达式运算符将要查找的字符分组为字符串或创建复杂的表达式。例如,要查找后跟“def”的可选字符串“abc”,请使用以下正则表达式:

(abc)?def

此表达式与以下字符串中的字符串“abcdef”和“def”匹配:

abcdefghi
defghi

表达式与字符串不匹配:

ghi

反向引用,反向引用可让您搜索重复的表达式。您可以使用 ‘\n’ 指定反向引用,其中 n 是 1 到 9 之间的整数,表示 n th,

反向引用可让您搜索重复的表达式。您可以使用 '\ n ' 指定反向引用,其中 n 是 1 到 9 之间的整数,表示 n th

例如,要查找重复出现的字符串“abc”或“def”,请使用以下正则表达式:

(abc|def)\1

该表达式匹配以下字符串:

abcabc
defdef

该表达式与以下字符串不匹配:

abcdef
abc

反向引用从每个前面的子表达式的左括号开始从左到右对子表达式进行计数。

反向引用允许您搜索重复的字符串,而无需提前知道实际的字符串。例如,正则表达式:

^(.*)\1$ 

匹配由同一字符串的两个相邻出现组成的行。

转义字符,使用转义字符 ‘’ 搜索通常被视为元字符的字符。例如,要搜索“+”字符,请使用以下正则表达式:

\+

此表达式与以下字符串中的加号“+”匹配:

abc+def

表达式与字符串中的任何字符都不匹配:

abcdef

线锚点的起点,使用行开头锚点 ^ 搜索仅出现在行开头的表达式。例如,要查找行开头出现的字符串 def ,请使用以下表达式:

^def

此表达式与字符串中的 def 匹配:

defghi

该表达式与以下字符串中的 def 不匹配:

abcdef

行末锚点,行尾锚元字符 ‘$’ 允许您搜索仅出现在行尾的表达式。例如,要查找出现在行尾的 def ,请使用以下表达式:

def$

此表达式与字符串中的 def 匹配:

abcdef

该表达式与以下字符串中的 def 不匹配:

defghi

POSIX 字符类,POSIX 字符类运算符允许您在字符列表中搜索属于特定 POSIX 字符类成员的表达式。您可以使用此运算符搜索具有特定格式的字符(例如大写字符),也可以搜索特殊字符(例如数字或标点符号字符)。支持全套 POSIX 字符类。

要使用此运算符,请使用语法 [: class :] 指定表达式,其中 class 是要搜索的 POSIX 字符类的名称为了。例如,要搜索一个或多个连续的大写字符,请使用以下正则表达式:

[[:upper:]]+

此表达式与字符串中的“DEF”匹配:

abcDEFghi

该表达式不返回以下字符串的匹配项:

abcdefghi

POSIX 整理序列,POSIX 整理序列元素运算符 [. .] 允许您在正则表达式中使用整理序列。您指定的元素必须是当前语言环境中定义的整理序列。
此运算符允许您在正则表达式中使用多字符整理序列,否则只允许使用一个字符。例如,您可以使用此运算符来确保整理序列“ch”(在西班牙语等语言环境中定义时)在取决于字符顺序的操作中被视为一个字符。
要使用整理序列运算符,请指定 [. element .] ,其中 element 是您要查找的整理序列。您可以使用当前区域设置中定义的任何整理序列,包括单字符元素和多字符元素。
例如,要查找整理序列“ch”,请使用以下正则表达式:

[[.ch.]]

此表达式与以下字符串中的序列“ch”匹配:

chabc

该表达式与以下字符串不匹配:

cdefg

您可以在需要排序规则的任何正则表达式中使用排序序列运算符。例如,要指定从“a”到“ch”的范围,可以使用以下表达式:

[a-[.ch.]]

POSIX 字符等效类,使用 POSIX 字符等效类运算符搜索当前区域设置中等效的字符。例如,查找西班牙语字符“ñ”以及“n”。

要使用此运算符,请指定 [= character =] ,以查找与指定 character .

例如,以下正则表达式可用于在西班牙语语言环境中搜索相当于“n”的字符:

[[=n=]]

此表达式与以下字符串中的“N”和“ñ”匹配:

El Niño 

完结!

refer: https://docs.oracle.com/cd/B13789_01/appdev.101/b10795/adfns_re.htm#1007566

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity构建详解(10)——Unity构建流程

【前言】 我们知道从源代码到可执行文件有四个步骤:预编译、编译、汇编、链接 预编译:处理源代码文件中的以“#”开始的各种预编译指令编译:通过语法语义分析等将源代码文件转为中间语言文件并进行优化,再生成汇编代码文件汇编&…

Vs Code npm install 报错解决方法

用的人家的前端框架发现是封装过的,要修改人家前端的话还得把前端源码放在Vs Code 上运行,后端放在IDEA上运行,然后前后端并行开发,在配置前端环境时遇到: npm install 这个的原因是我把node下载到D盘了权限不够框框爆…

android学习笔记(五)-MVP模式

1、MVP模式demo的实现,效果下: 2、创建一个Fruit类: package com.example.listview; //Fruit类就是Model,表示应用程序中的数据对象。 public class Fruit {private int imageId;private String name;private String price;publi…

代码随想录算法训练营Day6 | 242.有效的字母异位词 ●349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

基础: 1.哈希表是根据关键值进行直接访问的数据结构,时间复杂度是O(1),也就是通过数组的索引下标,直接访问数组中的元素哈希表的作用就是用来快速判断一个元素是否出现在集合里。 2.常见的哈希结构: 数组set &#…

计算机视觉 | 交通信号灯状态的检测和识别

Hi,大家好,我是半亩花海。本项目旨在使用计算机视觉技术检测交通信号灯的状态,主要针对红色和绿色信号灯的识别。通过分析输入图像中的像素颜色信息,利用OpenCV库实现对信号灯状态的检测和识别。 目录 一、项目背景 二、项目功能…

CalcPad(2) 单位设置和绘制图表

CalcPad(2) 单位设置和绘制图表 Hi uu们,CalcPad用的还好吗?有发现一些问题吗? 在我的使用中,经常需要指定一些计算结果的符号,比如说我希望ADC最小分辨率的计算结果是以uV展示,那我们该怎么操作呢&#…

DB索引B+树SQL优化

数据库的索引就像一本书的目录,查数据快人一步,快速定位,精准打击! 什么是数据库的索引? 官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加…

php时间人性化展示

在PHP中,可以使用date()函数和strtotime()函数来实现时间的人性化展示。下面是一个示例代码: <?php // 获取当前时间戳 $timestamp = time();// 格式化时间 $formattedTime = date(Y年m月d日 H:i:s, $timestamp);echo

入坑 Node.js 1

原文&#xff1a;https://blog.iyatt.com/?p14717 前言 前面刚刚对 Spring Boot 有了个概念&#xff0c;再来学学 Node.js&#xff0c;顺便当学 JavaScript&#xff0c;为后面入前端做准备。 环境 Node.js 20.12.2 官方 API 文档&#xff1a;https://nodejs.org/docs/lat…

IBM SPSS Statistics for Mac:强大的数据分析软件

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

day_8题解

利用最大公约数求最小公倍数 #include<iostream> using namespace std;int gcd(int a,int b) {return b?gcd(b,a%b):a; }int main() {long long a,b;cin>>a>>b;long long ansgcd(a,b);cout<<(a*b)/ans<<endl;return 0; }排序遍历&#xff0c;记…

支持中文繁体,支持同时配置并启用飞书和Lark认证,JumpServer堡垒机v3.10.8 LTS版本发布

2024年4月22日&#xff0c;JumpServer开源堡垒机正式发布v3.10.8 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化&#xff0c;并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本&#xff0c;以获得更佳的使用体验。 在v3.10.8 LTS版本中&…

一款支持串口、网口自定义协议的调试软件

ComMax通讯调试软件是一款支持自定义串口&#xff0c;网口通讯协议的调试软件&#xff0c;用户可以根据需要&#xff0c;自定义协议包&#xff0c;然后根据接受的数据选择要发送的数据包。是一款强大、好用的调试软件。 点击下载 提取码&#xff1a;wmfg 不用安装 下载解压即…

《史铁生》-随记

史铁生的文案进一段总是刷到&#xff0c;文字在某些时候真的是一种无形的动力。小时候学过的书&#xff0c;长大了才会更加理解其中的蕴意。如看到的文字所说&#xff0c;教育具有长期性和滞后性&#xff0c;就像一个闭环&#xff0c;多年后你有一个瞬间突然意识到什么&#xf…

怎么通过微信小程序实现远程控制包间内的电器

怎么通过微信小程序实现远程控制包间内的电器呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制包间内的电器&#xff0c;专用的包间控制器&#xff0c;可独立控制包间内的全部电器&#xff0c;包括空调。 可选用产品&#xff1a;可根据实际场景需求&…

Vue3 ts使用echarts

在 Vue 3 中&#xff0c;我们使用 ref 来访问元素节点&#xff0c;通过声明变量的方式来获取元素。 在template中&#xff0c;添加一个panel&#xff0c;需要指定尺寸 <div ref"area_panel" style"height:250px;width: 600px;"></div> 在sc…

ChatGPT在线网页版(与GPT Plus会员完全一致)

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

【Qt】UDP使用注意事项

1、问题描述 使用Qt实现UDP时实现单播、广播时遇到一些意想不到的事情,比如:接受的IP前缀是“::ffff:”;广播时出现回环数据等,特此记录下。 2、UDP示例 下面是一个最简单的UDP示例 #include "UdpSocket.h" #include <QUdpSocket> #include <QDebug…

php原生简单应用实例(用户登录)

在PHP中实现用户登录功能通常涉及以下几个步骤: 创建数据库和用户表: 首先,你需要一个数据库来存储用户信息。通常,你会有一个用户表,其中包含用户名、密码(通常加密存储)和其他可能的信息,如电子邮件地址。 HTML登录表单: 创建一个HTML表单,让用户输入用户名和密码。…

假设检验分析方法

目录 1.什么是假设检验分析方法 2.作用 3.使用 1.什么是假设检验分析方法 在数据分析中&#xff0c;假设检验是一种统计方法&#xff0c;用于确定样本数据是否支持对总体参数的某种假设。此法在数据分析中被广泛应用&#xff0c;可以帮助研究人员进行科学的推断和决策&#…