写点什么

关于 GaussDB(DWS) 的正则表达式知多少?人人都能看得懂的详解来了!

发布于: 2021 年 02 月 23 日

摘要:GaussDB(DWS)除了支持标准的 POSIX 正则表达式句法,还拥有一些特殊句法和选项,这些你可了解?本文便为你讲解这些特殊句法和选项。


概述


正则表达式(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)中的正则表达式函数



从表 1 中看到,GuassDB(DWS)支持的正则表达式函数都有一个可选的 flags 参数,该参数的可选项及其含义是什么呢?下面将展开进行详细举例说明。


GaussDB(DWS)正则表达式函数的 flags 参数详解


表 2 中列举了表 1 中 flags 参数的所有可选项。


表 2 GaussDB(DWS)正则表达式函数的 flags 参数的选项说明



g 选项表 2 中给出的 flags 参数选项描述,非常简洁,理解起来比较困难。下面通过一些示例,来直观帮助理解上面这些 flags 参数选项的含义。


示例 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 时,元字符点(.)不匹配换行符



示例 3-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 表示。


示例 7-1:在严格语法中,空白字符也是重要的



GaussDB(DWS)还有一个扩展语法,通过指定 x 选项表示。在扩展语法中,RE 中的空白字符(在这里,空白是空格、水平制表符、新行、和任何属于


space


字符类的字符。)将被忽略,以及 #和换行符(或 RE 的结尾)之间的所有字符也将被忽略。这种语法允许对复杂的 RE 进行分段落和注释。


示例 7-2:在扩展语法中,RE 中的空格被忽略



该规则有三个例外:


· 转义字符后的空白或 #被保留


示例 7-3




· 括号表达式中的空白或 #被保留


示例 7-4



· 空白和注释不能出现多字符符号中。在 ARE 里,方括弧表达式外面,序列(?#ttt) (这里的 ttt 是任意不包含)的文本)是一个注释,完全被忽略。


示例 7-5:空格出现在多字符符号中



示例 7-6:注释出现在多字符符号中



当 flags 中指定了多个有相反含义的选项时,则后出现的选项覆盖前面出现的选项


示例 8-1:后出现的 s 选项覆盖了 n 选项



示例 8-2:后出现的 n 选项覆盖了 s 选项



GaussDB(DWS)正则表达式的特殊句法


两个特殊的前缀:: 和=


一个 RE 可以以两个特殊的前缀中的某一个开头。


RE 以:开头*


RE 以*:开头,则剩余的 RE 被当作一个 ARE。(在 GaussDB(DWS)中,这通常没有作用,因为 RE 被假定为 ARE;但是,如果正则表达式函数的 flags 参数指定了 ERE 或 BRE 模式,那么它就会起作用。)


示例 9-1:在 BRE 匹配模式中(regexp_replace 函数的最后一个参数中指定的字母‘b’即表示使用 BRE 匹配模式),正则表达式中要表示圆括号表达式,需要将圆括号进行转义;同样,表示原子精确次数匹配序列的花括号,也需要进行转义



*示例 9-2:增加: 前缀后,即使指定了使用 BRE 匹配模式,也是按照 ARE 的匹配模式的规则进行匹配



RE 以=开头*


RE 以*=开头,则 RE 的其余部分被认为是一个字面字符串,所有字符都被认为是普通字符。


示例 10-1:‘|’在 ARE 匹配模式的正则表达式中是代表或含义的元字符



*示例 10-2:代表或含义的元字符‘|’,在以=为前缀的正则表达式中,失去其元字符的特殊含义,被看作字符串中的普通字符



嵌套选项


ARE 可以以嵌套选项开头:序列(?xyz) (其中 xyz 是一个或多个字母字符)指定影响 RE 其余部分的选项。这些选项覆盖任何先前确定的选项,特别是,它们可以覆盖由正则表达式运算符或正则表达式函数的 flags 参数隐含的大小写敏感行为。可选择的字母如表 2 所示中除’g’选项外的其他选项。


示例 11-1:不含嵌套选项的大小写不敏感匹配



示例 10-2:嵌套选项中的大小写敏感覆盖 flags 中的大小写不敏感匹配



结语


通过上面丰富的示例,深入了解了 GaussDB(DWS)正则表达式的特殊句法和 flags 选项含义,在使用 GaussDB(DWS)正则表达式函数时便可以得心应手。


本文分享自华为云社区《GaussDB(DWS)的正则表达式知多少 》,原文作者:wangxiaojuan8 。


点击关注,第一时间了解华为云新鲜技术~


发布于: 2021 年 02 月 23 日阅读数: 10
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
关于GaussDB(DWS)的正则表达式知多少?人人都能看得懂的详解来了!