REGEXP_INSTR

返回字符串中正则表达式所匹配的开始或结束位置。如果正则表达式在字符串中没有找到匹配项,REGEXP_INSTR 将返回 0。

此函数使用默认区域设置对 UTF-8 字符串进行操作,即使区域设置设置为其他方式。

语法

REGEXP_INSTR ( string-expression, pattern 
   [, position [, occurrence [, return‑position [, regexp‑modifier ]... [, captured‑subexp ]]]] )

参数

string-expression

VARCHARLONG VARCHAR 表达式,用于评估在模式中指定的正则表达式是否匹配。如果字符串表达式位于在 Flex 表或列式表的 __raw__ 列中,则在搜索模式之前将字符串转换为 LONG VARCHAR

模式

字符串表达式匹配的正则表达式。正则表达式必须符合 Perl 正则表达式语法

position
函数应该从自字符串开头算起的多少个字符开始搜索匹配项。默认情况下,函数从第一个(最左侧)字符开始搜索匹配项。如果将此参数设置为大于 1 的值,将从您指定的第 n 个字符开始搜索匹配项。

默认值: 1

occurrence
控制要返回字符串中第几次出现的模式匹配项。默认情况下,函数返回第一个匹配子字符串的位置。使用此参数可以查找后续匹配子字符串的位置。例如,如果将此参数设置为 3,将返回与模式匹配的第三个子字符串的位置。

默认值: 1

return‑position
设置字符串内要返回的位置。如果使用默认位置 (0),函数将返回与模式匹配的子字符串的第一个字符的字符串位置。如果将 return‑position 设为 1,函数将返回匹配的子字符串结束后的第一个字符的位置。

默认值: 0

regexp‑modifier

[可选] 一个或多个单字符标志,可修改正则表达式模式字符串表达式匹配的方式:

  • b: 将字符串视为二进制八位字节数,而不是 UTF-8 字符。

  • c (默认值): 强制匹配区分大小写。

  • i: 强制匹配不区分大小写。

  • m: 将要匹配的字符串视为多行。使用此修饰符,可使行头 (^) 和行尾 ($) 的正则表达式运算符与字符串内的换行符 (\n) 相匹配。如果没有 m 修饰符,行头和行尾运算符仅与字符串的开头和结尾相匹配。

  • n: 将正则表达式运算符 (.) 与换行符 (\n) 相匹配。默认情况下,. 运算符可与除换行符以外的任何字符相匹配。

  • x: 将注释添加到正则表达式。x 修饰符可导致函数忽略正则表达式中所有未经转义的空格字符和注释。注释以哈希 (#) 字符开始,以换行符 (\n) 结束。在字符串中匹配的正则表达式中的所有空格都必须使用反斜杠 (\\) 字符进行转义。

captured‑subexp
要返回其位置的括住的子表达式。默认情况下,函数将返回 string 中与正则表达式匹配的第一个字符的位置。如果将此值设置为从 1 到 9,函数将返回由正则表达式中相应的一组圆括号括住的子表达式。例如,如果将此值设置为 3,将返回由正则表达式中第三组圆括号括住的子字符串。

默认值: 0

示例

在指定字符串 (easy come, easy go) 中查找以字母 e 开头并以字母 y 结尾的字母序列的第一个实例。

=> SELECT REGEXP_INSTR('easy come, easy go','e\w*y');
 REGEXP_INSTR
--------------
            1
(1 row)

自第二个字符 (2) 开始,查找以字母 e 开头并以字母 y 结尾的第一个字母序列:

=> SELECT REGEXP_INSTR('easy come, easy go','e\w*y',2);
 REGEXP_INSTR
--------------
           12
(1 row)

自第一个字符 (1) 开始,查找以字母 e 开头并以字母 y 结尾的第二个字母序列:

=> SELECT REGEXP_INSTR('easy come, easy go','e\w*y',1,2);
 REGEXP_INSTR
--------------
           12
(1 row)

查找第一个空格之后的第一个字符的位置:

=> SELECT REGEXP_INSTR('easy come, easy go','\s',1,1,1);
 REGEXP_INSTR
--------------
            6
(1 row)

通过将每个单词捕获为一个子表达式并返回第三个子表达式的开始位置,查找字符串中第三个单词的开始位置。

=> SELECT REGEXP_INSTR('one two three','(\w+)\s+(\w+)\s+(\w+)', 1,1,0,'',3);
REGEXP_INSTR
--------------
            9
(1 row)