REGEXP_INSTR 函数
在字符串中搜索正则表达式模式并返回指示匹配子字符串的开始位置的整数。如果未找到匹配项,此函数将返回 0
。REGEXP_INSTR 与 函数相似,只不过前者可让您在字符串中搜索正则表达式模式。有关正则表达式的更多信息,请参阅 POSIX 运算符和 Wikipedia 中的 Regular expression
语法
REGEXP_INSTR( source_string, pattern [, position [, occurrence] [, option [, parameters ] ] ] ] )
参数
- source_string
-
要搜索的字符串表达式(如列名称)。
- pattern
-
表示正则表达式模式的 UTF-8 字符串文本。有关更多信息,请参阅 POSIX 运算符。
- position
-
(可选)指示在 source_string 中开始搜索的位置的正
INTEGER
。此位置基于字符数而不是字节数,这是为了将多字节字符作为单字符计数。默认为1
。如果 position 小于1
,则搜索从 source_string 的第一个字符开始。如果 position 大于 source_string 中字符的数量,则结果为0
。 - 出现
-
(可选)一个正
INTEGER
,指示要使用的模式的哪一次出现。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) 方言解释模式。有关 PCRE 的更多信息,请参阅 Wikipedia 中的 Perl Compatible Regular Expressions
。
-
返回类型
整数
示例
以下示例使用 TICKIT 示例数据库的 USERS 表中的数据。有关更多信息,请参阅 示例数据库。
要搜索作为域名开头的 @
字符并返回第一个匹配项的开始位置,请使用以下示例。
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 | +--------------+