REGEXP_INSTR 函数 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

REGEXP_INSTR 函数

在字符串中搜索正则表达式模式并返回指示匹配子字符串的开始位置的整数。如果未找到匹配项,此函数将返回 0。REGEXP_SUBSTR 与 函数相似,只不过前者可让您在字符串中搜索正则表达式模式。有关正则表达式的更多信息,请参阅 POSIX 运算符

Syntax

REGEXP_INSTR ( source_string, pattern [, position [, occurrence] [, option [, parameters ] ] ] ] )

Arguments

source_string

要搜索的字符串表达式(如列名称)。

pattern

表示 SQL 标准正则表达式模式的字符串文本。

position

指示在 source_string 中开始搜索的位置的正整数。此位置基于字符数而不是字节数,这是为了将多字节字符作为单字符计数。默认值为 1。如果 position 小于 1,则搜索从 source_string 的第一个字符开始。如果 position 大于 source_string 中字符的数量,则结果为 0。

出现

一个正整数,指示要使用的模式的匹配项。REGEXP_INSTR 会跳过第一个 occurrence -1 匹配项。默认值为 1。如果 occurrence 小于 1 或大于 source_string 中的字符串,则会忽略搜索,并且结果为 0。

option

一个值,指示是否返回匹配项的第一个字符的位置 (0) ,或匹配项结尾后第一个字符的位置 (1)。非零值与 1 相同。默认值是 0。

参数

一个或多个字符串,指示函数与模式的匹配方式。可能的值包括:

  • c – 执行区分大小写的匹配。默认情况下,使用区分大小写的匹配。

  • i – 执行不区分大小写的匹配。

  • e – 使用子表达式提取子字符串。

    如果 pattern 包含一个子表达式,REGEXP_INSTR 会使用 pattern 中的第一个子表达式来匹配子字符串。REGEXP_INSTR 仅考虑第一个子表达式;其他子表达式会被忽略。如果模式没有子表达式,REGEXP_INSTR 会忽略“e”参数。

  • p – 使用 Perl 兼容正则表达式 (PCRE) 方言解释模式。

返回类型

整数

Example

以下示例搜索作为域名的开头的 @ 字符并返回第一个匹配项的开始位置。

SELECT email, regexp_instr(email, '@[^.]*') FROM users ORDER BY userid LIMIT 4; email | regexp_instr -----------------------------------------------+-------------- Etiam.laoreet.libero@sodalesMaurisblandit.edu | 21 Suspendisse.tristique@nonnisiAenean.edu | 22 amet.faucibus.ut@condimentumegetvolutpat.ca | 17 sed@lacusUtnec.ca | 4

以下示例搜索单词 Center 的变体并返回第一个匹配项的开始位置。

SELECT venuename, regexp_instr(venuename,'[cC]ent(er|re)$') FROM venue WHERE regexp_instr(venuename,'[cC]ent(er|re)$') > 0 ORDER BY venueid LIMIT 4; venuename | regexp_instr -----------------------+-------------- The Home Depot Center | 16 Izod Center | 6 Wachovia Center | 10 Air Canada Centre | 12

以下示例使用不区分大小写的匹配逻辑找到字符串 FOX 第一次出现的起始位置。

SELECT regexp_instr('the fox', 'FOX', 1, 1, 0, 'i'); regexp_instr -------------- 5

以下示例使用用 PCRE 方言编写的模式来定位至少包含一个数字和一个小写字母的单词。它使用 ?= 运算符,它在 PCRE 中具有特定的前瞻含义。此示例查找第二个此类单词的起始位置。

SELECT regexp_instr('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 0, 'p'); regexp_instr -------------- 21

以下示例使用用 PCRE 方言编写的模式来定位至少包含一个数字和一个小写字母的单词。它使用 ?= 运算符,它在 PCRE 中具有特定的前瞻含义。本示例查找第二个此类单词的起始位置,但与前面的示例不同,因为它使用了不区分大小写的匹配。

SELECT regexp_instr('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 0, 'ip'); regexp_instr -------------- 15