- 类别:
REGEXP_INSTR¶
返回字符串主体中正则表达式模式的指定匹配项的位置。
另请参阅 字符串函数(正则表达式)。
语法¶
实参¶
必填:
subject用于搜索匹配项的字符串。
pattern要匹配的模式。
有关指定模式的准则,请参阅 字符串函数(正则表达式)。
可选:
positionNumber of characters from the beginning of the string where the function starts searching for matches. The value must be a positive integer.
默认值:``1``(搜索匹配项时,从左边的第一个字符开始)
occurrence指定要从中开始返回匹配项的模式的第一次出现。
该函数会跳过第一个
occurrence - 1匹配项。例如,如果存在 5 个匹配项,并且您为occurrence实参指定3个匹配项,则该函数将忽略前两个匹配项,并返回第三个、第四个和第五个匹配项。默认:
1option指定是返回匹配项 (
0) 的第一个字符的偏移,还是返回匹配项 (1) 结束后第一个字符的偏移。默认:
0regexp_parameters包含一个或多个字符的字符串,指定用于搜索匹配项的参数。支持的值:
参数
描述
c区分大小写的匹配
i不区分大小写的匹配
m多行模式
e提取子匹配项
sSingle-line mode POSIX wildcard character
.matches\n默认:
cFor more information, see 为正则表达式指定参数.
备注
默认情况下,REGEXP_INSTR 返回主题的整个匹配部分的开始或结束字符偏移。但是,如果指定了
e(适用于“extract”)参数,则 REGEXP_INSTR 返回与模式中第一个子表达式匹配的主题部分的开始或结束字符偏移。如果指定了e,但未同时指定group_num,则group_num的值将默认为 1(第一组)。 如果模式中没有子表达式,则 REGEXP_INSTR 表现得如同未设置e。有关使用e的示例,请参阅本主题中的 示例。group_numgroup_num参数指定要提取的组。通过在正则表达式中使用括号来指定组。如果指定了
group_num,则 Snowflake 允许在未同时指定e选项的情况下执行提取。e选项是隐含的。Snowflake 至多支持 1024 个组。
有关使用
group_num的示例,请参阅本主题中的 捕获组示例。
返回¶
返回类型 NUMBER 的值。
如果未找到匹配项,则返回 0。
使用说明¶
位置从 1 开始,而不是从 0 开始。例如,“MAN”中“M”的位置是 1,而不是 0。
有关其他使用说明,请参阅关于正则表达式函数的 一般使用说明。
排序规则详细信息¶
Arguments with collation specifications currently aren't supported.
示例¶
以下示例使用 REGEXP_INSTR 函数。
基本示例¶
创建表并插入数据:
搜索匹配的字符串。在这种情况下,字符串是 nevermore,后跟一个十进制数字(例如,nevermore1)。示例使用 REGEXP_SUBSTR 函数显示匹配的子字符串:
搜索匹配的字符串,但从字符串中的第五个字符开始,而不是从字符串中的第一个字符开始:
搜索匹配的字符串,但查找第三个匹配项,而不是第一个匹配项:
此查询与上一个查询几乎相同,但此查询显示如何使用 option 实参来指明是需要匹配表达式的位置,还是需要匹配表达式后第一个字符的位置:
此查询显示,如果您搜索上次实际出现之外的出现,则返回的位置为 0:
捕获组示例¶
本部分介绍如何使用正则表达式的“组”功能。
本部分中的前几个示例不使用捕获组。本部分从一些简单的示例开始,然后继续使用捕获组的示例。
这些示例使用下面创建的字符串:
字符串具有以下特征:
id为2的字符串中多次出现单词“the”。id为3的字符串中多次出现单词“the”,单词之间有额外的空格。id为4字符的字符串中,字符序列“the”出现在多个单词中(如“thespian”和“theater”),但未单独出现“the”这个单词。
此示例查找单词 the 的第一次出现,后跟一个或多个非单词字符(例如,用于分隔单词的空格),后跟一个或多个单词字符。
“单词字符”不仅包括字母 a-z 和 A-Z,还包括下划线(“_”)和十进制数字 0-9,但不包括空格、标点符号等。
从字符串的位置 1 开始,查找单词 the 的第二次出现,后跟一个或多个非单词字符,后跟一个或多个单词字符。
此示例与前面的示例类似,但添加了捕获组。此查询不返回整个匹配项的位置,而是仅返回 组 的位置(即,子字符串中与括号中正则表达式部分匹配的部分)。在这种情况下,返回的值是单词 the 在第二次出现后的位置。
如果您指定 'e'`(提取)参数,但不指定 :samp:`{group_num},则 group_num 默认为 1:
如果您指定 group_num,则即使您未指定 :code:`'e'`(提取)作为其中一个参数,Snowflake 也会假定您要提取:
此示例展示如何从双单词模式(第一个单词为 A)的第一个、第二个和第三个匹配项中检索第二个单词的位置。这也表明,尝试超越最后一个模式会导致 Snowflake 返回 0。
创建表并插入数据:
运行查询:
此示例展示如何检索模式第一次出现时第一个、第二个和第三个组的位置。在本案例中,返回值是单词 MAN 的各个字母的位置。
其他示例¶
以下示例匹配单词 was 的出现。匹配从字符串中的第一个字符开始,并返回第一次出现后的字符在字符串中的位置:
以下示例返回与模式匹配的字符串部分的第一个字符的偏移。匹配从字符串中的第一个字符开始,并返回模式的第一次出现:
以下示例与上一个示例相同,但使用参数 e 返回与模式中第一个子表达式匹配的主题部分的字符偏移(即 the 之后的第一组单词字符):
以下示例匹配以 st 结尾且前面有两个或多个字母字符的单词的出现(不区分大小写)。匹配从字符串中的第十五个字符开始,并返回第一次出现后的字符在字符串中的位置(以 worst 开始):
要运行下一组示例,请创建表并插入数据:
返回包含小写 o 的第一个匹配中第一个字符的偏移:
返回包含小写 o 的第一个匹配中第一个字符的偏移,从主题中的第三个字符开始:
返回包含小写 o 的第三个匹配中第一个字符的偏移,从主题中的第三个字符开始:
返回包含小写 o 的第三个匹配中最后一个字符的偏移,从主题中的第三个字符开始:
返回包含小写 o 的第三个匹配中最后一个字符的偏移,从主题中的第三个字符开始,不区分大小写的匹配: