

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# REGEXP\$1INSTR 函数
<a name="REGEXP_INSTR"></a>

在字符串中搜索正则表达式模式并返回指示匹配子字符串的开始位置的整数。如果未找到匹配项，此函数将返回 `0`。REGEXP\$1INSTR 与 [ 函数相似，只不过前者可让您在字符串中搜索正则表达式模式。](r_POSITION.md)有关正则表达式的更多信息，请参阅 [POSIX 运算符](pattern-matching-conditions-posix.md)和 Wikipedia 中的 [Regular expression](https://en.wikipedia.org/wiki/Regular_expression)。

## 语法
<a name="REGEXP_INSTR-synopsis"></a>

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

## 参数
<a name="REGEXP_INSTR-arguments"></a>

 *source\$1string*   
要搜索的字符串表达式（如列名称）。

 *pattern*   
表示正则表达式模式的 UTF-8 字符串文本。有关更多信息，请参阅 [POSIX 运算符](pattern-matching-conditions-posix.md)。

 *position*   
（可选）指示在 *source\$1string* 中开始搜索的位置的正 `INTEGER`。此位置基于字符数而不是字节数，这是为了将多字节字符作为单字符计数。默认值为 `1`。如果 *position* 小于 `1`，则搜索从 *source\$1string* 的第一个字符开始。如果 *position* 大于 *source\$1string* 中字符的数量，则结果为 `0`。

 *出现*   
（可选）一个正 `INTEGER`，指示要使用的模式的哪一次出现。REGEXP\$1INSTR 会跳过第一个 `occurrence-1` 匹配项。默认值为 `1`。如果 *occurrence* 小于 `1` 或大于 *source\$1string* 中的字符数量，则会忽略搜索且结果为 `0`。

 *option*( )   
（可选）一个值，指示是返回匹配项的第一个字符的位置（`0`），还是匹配项结尾后面第一个字符的位置（`1`）。非零值与 `1` 相同。默认值为 `0`。

 *参数*   
（可选）一个或多个字符串文本，指示函数与模式的匹配方式。可能的值包括：  
+ c – 执行区分大小写的匹配。默认情况下，使用区分大小写的匹配。
+ i – 执行不区分大小写的匹配。
+ e – 使用子表达式提取子字符串。

  如果 *pattern* 包含一个子表达式，REGEXP\$1INSTR 会使用 *pattern* 中的第一个子表达式来匹配子字符串。REGEXP\$1INSTR 仅考虑第一个子表达式；其他子表达式会被忽略。如果模式没有子表达式，REGEXP\$1INSTR 会忽略“e”参数。
+ p – 使用 Perl 兼容正则表达式 (PCRE) 方言解释模式。有关 PCRE 的更多信息，请参阅 Wikipedia 中的 [Perl Compatible Regular Expressions](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)。

## 返回类型
<a name="REGEXP_INSTR-return-type"></a>

整数

## 示例
<a name="REGEXP_INSTR-examples"></a>

以下示例使用 TICKIT 示例数据库的 USERS 表中的数据。有关更多信息，请参阅 [示例数据库](c_sampledb.md)。

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

```
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 |
+--------------+
```