GaussDB(DWS)的正则表达式知多少
概述
正则表达式(Regular Expression,简称RE),通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式使用比较灵活,功能强大,因此经常被用到进行文本的搜索和替换中,帮助开发人员快速进行批量文本查询和处理。比如常用的linux的grep命令,许多程序设计语言比如Perl、Tcl也都支持正则表达式进行字符串操作。
GaussDB(DWS)支持的正则表达式
POSIX 1003.2中定义的正则表达式RE有两种形式:扩展RE或ERE(大致为egrep的RE),和基本RE或BRE(大致为ed的RE),GaussDB(DWS)都支持这两种形式,并实现了在编程语言(如Perl和Tcl)中广泛使用而POSIX标准中未包含的一些扩展。使用这些非POSIX扩展的RE在本文中称为高级RE或ARE。ARE几乎是ERE的超集,但是BRE有几种符号不相容性(而且是有限的)。
GaussDB(DWS)的正则表达式的主要句法和在其他程序语言中支持的句法功能相同,此文不再赘述。本文中对GaussDB(DWS)拥有的特殊形式和句法进行说明。
GuassDB(DWS)支持的正则表达式函数
GaussDB(DWS)提供了支持POSIX正则表达式的函数,如表1所示。
表1 GaussDB(DWS)中的正则表达式函数
函数 |
返回类型 |
描述 |
参数说明 |
regexp_replace(string text, pattern text, replacement text [, flags text]) |
Text |
提供了将匹配POSIX正则表达式模式的子串替换为新文本的功能 |
string:待处理的源字符串 pattern:一个正则表达式RE replacement:用此字符串替换原字符串中匹配的部分 flags:可选参数,具体取值参见表2 |
regexp_matches(string text, pattern text [, flags text]) |
setof text[] |
返回一个文本数组,该数组由匹配一个POSIX正则表达式模式得到的所有被捕获子串构成 |
|
regexp_split_to_table(string text, pattern text [, flags text]) |
setof text |
把一个POSIX正则表达式模式当作一个定界符来分离一个串 |
|
regexp_split_to_array(string text, pattern text [, flags text ]) |
text[] |
和regexp_split_to_table类似,是一个正则表达式分离函数,不过它的结果以一个text数组的形式返回 |
从表1中看到,GuassDB(DWS)支持的正则表达式函数都有一个可选的flags参数,该参数的可选项及其含义是什么呢?下面将展开进行详细举例说明。
GaussDB(DWS)正则表达式函数的flags参数详解
表2中列举了表1中flags参数的所有可选项。
表2 GaussDB(DWS)正则表达式函数的flags参数的选项说明
选项 |
描述 |
b |
RE是一个BRE,表示按照BRE匹配模式的规则进行匹配 |
c |
大小写敏感匹配 (是一个可被覆盖的操作符类型) |
g |
表示替换每一个匹配的子字符串而不仅仅是第一个。默认仅替换第一个匹配的子字符串 |
i |
大小写不敏感匹配(是一个可被覆盖的操作符类型) |
m |
和选项n同义 |
n |
换行敏感匹配,此选项生效时,换行符影响元字符(.、^、$和[^)的匹配 |
p |
部分换行敏感匹配,此选项生效时,换行符影响元字符(.和[^)的匹配。部分是相对选项n而言 |
q |
RE被认为是加双引号的文本字符串,所有字符都是普通字符 |
s |
非换行敏感匹配(默认),与n相对 |
t |
紧凑语法(默认) |
w |
反部分换行敏感匹配,此选项生效时,换行符影响元字符(^和$)的匹配。部分是相对选项n而言 |
x |
扩展语法 |
表2中给出的flags参数选项描述,非常简洁,理解起来比较困难。下面通过一些示例,来直观帮助理解上面这些flags参数选项的含义。
g选项
示例1-1:未指定’g‘选项,仅对第一个匹配项进行替换
示例1-2:指定’g‘选项,对所有匹配项进行替换
c 和 i 选项
示例2-1:默认情况下,进行大小写敏感匹配
示例2-2:显示指定进行大小写敏感匹配
示例2-3:显示指定进行大小写不敏感匹配
n[或m]、s、p、w选项对元字符点(.)的影响
示例3-1:指定选项n时,元字符点(.)不匹配换行符
示例3-2:指定选项s时,元字符点(.)匹配换行符
示例3-3:指定选项p时,元字符点(.)不匹配换行符
示例4-4:指定选项w时,元字符点(.)匹配换行符
n[或m]、s、p、w选项对元字符^、$的影响
示例5-1:指定选项n时,元字符点^、$匹配行首和行尾
示例5-2:指定选项s时,元字符点^、$不匹配行首和行尾
示例5-3:指定选项p时,元字符点^、$不匹配行首和行尾
示例5-4:指定选项w时,元字符点^、$匹配第一个行首匹配的行到最后一个行尾匹配的行
n[或m]、s、p、w选项对元字符 [^ 的影响
示例6-1:指定选项n时,换行符不匹配被[^排除的字符,所有行尾的换行符未被替换为M
示例6-2:指定选项s时,换行符匹配被[^排除的字符,所有行尾的换行符被替换为M
示例6-3:指定选项p时,换行符不匹配被[^排除的字符,所有行尾的换行符被替换为M
示例6-4:指定选项w时,换行符匹配被[^排除的字符,所有行尾的换行符被替换为M
t 和 x 选项
通常情况下,RE语法都是严格的,即RE中的所有字符都是重要的。严格语法是默认的,也可以通过指定选项t表示。
示例6-1:在严格语法中,空白字符也是重要的
GaussDB(DWS)还有一个扩展语法,通过指定x选项表示。在扩展语法中,RE中的空白字符(在这里,空白是空格、水平制表符、新行、和任何属于space字符类的字符。)将被忽略,以及#和换行符(或RE的结尾)之间的所有字符也将被忽略。这种语法允许对复杂的RE进行分段落和注释。
示例6-2:在扩展语法中,RE中的空格被忽略
该规则有三个例外:
- 转义字符\后的空白或#被保留
示例6-3
- 括号表达式中的空白或#被保留
示例6-4
- 空白和注释不能出现多字符符号中。在 ARE 里,方括弧表达式外面,序列(?#ttt) (这里的ttt是任意不包含)的文本)是一个注释,完全被忽略。
示例6-5:空格出现在多字符符号中
示例6-6:注释出现在多字符符号中
当flags中指定了多个有相反含义的选项时,则后出现的选项覆盖前面出现的选项
示例7-1:后出现的s选项覆盖了n选项
示例7-2:后出现的n选项覆盖了s选项
GaussDB(DWS)正则表达式的特殊句法
两个特殊的前缀:***: 和***=
一个RE可以以两个特殊的前缀中的某一个开头。
RE以***:开头
RE以***:开头,则剩余的RE被当作一个ARE。(在GaussDB(DWS)中,这通常没有作用,因为RE被假定为ARE;但是,如果正则表达式函数的flags参数指定了ERE或BRE模式,那么它就会起作用。)
示例8-1:在BRE匹配模式中(regexp_replace函数的最后一个参数中指定的字母‘b’即表示使用BRE匹配模式),正则表达式中要表示圆括号表达式,需要将圆括号进行转义;同样,表示原子精确次数匹配序列的花括号,也需要进行转义
示例8-2:增加***: 前缀后,即使指定了使用BRE匹配模式,也是按照ARE的匹配模式的规则进行匹配
RE以***=开头
RE以***=开头,则RE的其余部分被认为是一个字面字符串,所有字符都被认为是普通字符。
示例9-1:‘|’在ARE匹配模式的正则表达式中是代表或含义的元字符
示例9-2:代表或含义的元字符‘|’,在以***=为前缀的正则表达式中,失去其元字符的特殊含义,被看作字符串中的普通字符
嵌套选项
ARE可以以嵌套选项开头:序列(?xyz) (其中xyz是一个或多个字母字符)指定影响RE其余部分的选项。这些选项覆盖任何先前确定的选项,特别是,它们可以覆盖由正则表达式运算符或正则表达式函数的flags参数隐含的大小写敏感行为。可选择的字母如表2所示中除’g’选项外的其他选项。
示例10-1:不含嵌套选项的大小写不敏感匹配
示例10-2:嵌套选项中的大小写敏感覆盖flags中的大小写不敏感匹配
结语
通过上面丰富的示例,深入了解了GaussDB(DWS)正则表达式的特殊句法和flags选项含义,在使用GaussDB(DWS)正则表达式函数时便可以得心应手。
- 点赞
- 收藏
- 关注作者
评论(0)