正则表达式函数¶
BodoSQL 目前通过 re 模块使用 Python 的正则表达式库。虽然这可能会发生变化,但这意味着与 Snowflake 的正则表达式函数的行为存在几个偏差 (请参阅此处获取 Snowflake 文档)。关键点和主要偏差如下所示:
-
Snowflake 使用 POSIX ERE 正则表达式语法的超集。这意味着 BodoSQL 可以利用一些 Snowflake 不能使用的正则表达式的语法形式 (见此处以获取 Python re 文档)。然而,POSIX ERE 具有一些 Python 的
re所不具备的特性: -
POSIX字符类 (请参阅此处以获取完整列表)。BodoSQL确实将这些作为字符集的宏支持。换句话说,
[[:lower:]]被转换为[a-z]。然而,这种替换形式无法转义。此外,任何应该包含空终止符\x00的字符类实际上是从\x01开始的。 -
等价类(BodoSQL不支持)。
-
当使用交替模式时返回最长的匹配(BodoSQL 返回最左侧的匹配)。
-
正则表达式函数可以选择性地接受一个标志参数。标志是一个字符串,其中的字符控制模式匹配的方式。当字符包含在标志字符串中时,以下字符具有意义:
-
'c': 区分大小写的匹配(默认行为) 'i': 不区分大小写的匹配(如果同时提供 'c' 和 'i',则使用最后一个出现的)'m': 允许锚点模式与每行的开始/结束互动,而不仅仅是整个字符串的开始/结束。's': 允许.元字符捕获换行符-
'e': 请参见REGEXP_SUBSTR/REGEXP_INSTR -
目前,BodoSQL 支持惰性
?操作符,而 Snowflake 不支持。因此,例如,在 Snowflake 中,模式`(.*?),'将匹配尽可能多的字符,只要最后一个字符是逗号。然而,在 BodoSQL 中,匹配将在第一个逗号处结束。 -
目前,BodoSQL 支持以下正则表达式特性,这些特性在 Snowflake 中使用时会崩溃:
(?...),\A,\Z,\1,\2,\3等。 -
目前,BodoSQL要求模式参数和标志参数(如果提供)必须是字符串字面量,而不是列或表达式。
-
目前,如果某些字符在Python中有特定含义,则可能需要额外的反斜杠来进行转义。正确定义转义字符所需的反斜杠数量取决于使用情况。
-
所有匹配都是不重叠的。
-
如果任何数字参数为零或负数,或者
group_num参数超出范围,则会引发错误。唯一的例外是REGEXP_REPLACE,它允许其出现参数为零。
BodoSQL 目前支持以下正则表达式函数:
REGEXP_LIKE¶
-
REGEXP_LIKE(str, pattern[, flag])如果整个字符串与模式匹配,则返回
true。
如果未提供flag,将使用''。如果模式是空的,则如果字符串也是空的,返回
true。例如:
-
2 个参数:如果
A是一个 5 个字符的字符串,其中第一个字符是 a,最后一个字符是 z,中间的 3 个字符也是小写字母(区分大小写),则返回true。 -
3 个参数:如果
A以字母'THE'开头(不区分大小写),则返回true。
-
正则表达式计数¶
-
REGEXP_COUNT(str, pattern[, position[, flag]])返回字符串中与模式匹配的次数,从由
position参数指定的位置开始(使用1索引)。如果没有提供position,则使用1。如果没有提供flag,则使用''。如果模式为空,返回0。
例如:
-
2 个参数:返回任何字母在
A中出现的次数。 -
3个参数:返回任意数字字符在
A中出现的次数,不包括前5个字符。 -
4 个参数:返回子字符串在
A中出现的次数,该子字符串包含两个 一和任意字符(包括换行符)在中间。
-
正则表达式替换¶
-
REGEXP_REPLACE(str, pattern[, replacement[, position[, occurrence[, flag]]]])返回输入字符串的版本,其中每个与模式匹配的部分都被替换为替换字符串,从
position参数指定的位置开始(使用1索引)。occurrence参数指定要替换的匹配项,其中0表示替换所有匹配项。如果未提供replacement,则使用''。如果未提供position,则使用1。如果未提供occurrence,则使用0。如果未提供flag,则使用''。如果匹配的数量不足,或者模式为空,原始字符串将被返回。
注意
替换模式中的反向引用是支持的,但可能需要额外的反斜杠才能正确工作。
例如:
-
2 个参数:删除所有在
A中的空白字符。 -
3 个参数:用
'love'替换A中所有出现的'hate'(区分大小写)。 -
4 个参数:将
A中所有连续两个数字的出现替换为相同的两个数字的反转,不包括前两个字符。 -
5 个参数:用下划线替换
A中的第一个字符。 -
6 个参数:从每行中移除第一个和最后一个单词,这些行包含至少 3 个单词。
-
正则表达式_SUBSTR¶
-
REGEXP_SUBSTR(str, pattern[, position[, occurrence[, flag[, group_num]]]])返回与模式匹配的原始字符串的子串,从由
position参数指定的位置开始(使用1索引)。occurrence参数指定要提取哪个匹配(使用1索引)。如果未提供position,则使用1。如果未提供occurrence,则使用1。如果未提供flag,则使用''。如果未提供group_num,并且flag包含'e',则使用1。如果提供了group_num但标志不包含e,则它的行为就像包含e。如果标志确实包含e,那么将返回匹配的一个子组,而不是整个匹配。返回的子组对应于group_num参数(使用1索引)。如果匹配的数量不足,或者模式为空,
NULL将被返回。例如:
-
2 个参数:返回出现在
A内部的第一个数字。 -
3 个参数:返回在
A中出现的第一个标点符号,排除前 10 个字符。 -
4 个参数:返回字符串
A中连续出现的第二个小写元音的第四个实例。 -
5 个参数:返回
A中以元音字母开头和结尾的第一个 3+ 个字符的子字符串(不区分大小写,并且可以包含换行符)。 -
6 个参数:查找
A中第三次出现的一个数字,后面跟着一个冒号、一个空格和一个以'a'开头的单词(区分大小写),并返回以'a'开头的单词。
-
REGEXP_INSTR¶
-
REGEXP_INSTR(str, pattern[, position[, occurrence[, option[, flag[, group_num]]]]])返回原始字符串中导致与模式匹配的位置,从
position参数指定的位置开始(使用1索引)。occurrence参数指定要提取的匹配项(使用1索引)。option参数指定是返回匹配的起始位置(如果0)还是匹配结束后的第一个位置(如果1)。如果未提供position,则使用1。如果未提供occurrence,则使用1。如果未提供option,则使用0。如果未提供flag,则使用''。如果未提供group_num,并且flag包含'e',则使用1。如果提供了group_num,但标志不包含e,那么它的行为就像包含了一样。如果标志确实包含e,则返回匹配的子组之一的位置,而不是整个匹配的位置。返回的子组对应于group_num参数(使用1索引)。如果匹配的数量不足,或者模式为空,
0会被返回。-
2 个参数:返回
A中第一个'#'的索引。 -
3 个参数:返回在
A中首次出现的 3 个连续数字的起始索引,排除前 3 个字符。 ```sql SELECT REGEXP_INSTR(A, '\d{3}', 4) -
5 个参数:返回第一个以非 ASCII 字符开头和结尾的子字符串的结束索引。
-
6 个参数:返回以大写元音开头的
A的第二行的起始索引。 -
7 个参数:查找
A中第一个符合电话簿名称格式的子字符串(即Lastname, Firstname),并返回第一个名称的起始索引。
-