# ExtractRegEx - 脚本和图表函数

ExtractRegEx() 使用指定的正则表达式模式从输入字符串表达式中提取文本。如果没有找到匹配项，函数将返回空值。

该函数执行大小写敏感的正则表达式操作。您也可以用变种 ExtractRegExI() 来作为替代，执行不区分大小写的正则表达式操作。

语法：

ExtractRegEx (text, regex [, field\_no])

返回数据类型： 字符串

参数

| 参数 | 描述 |
| --- | --- |
| text | 字符串表达式，包含要在返回值中提取的文本。 |
| regex | 用于提取文本的正则表达式。 |
| field\_no | 要提取的匹配项的编号。当正则表达式在文本中可能有多个匹配项时，这个功能非常有用。例如，指定 `4` 提取第四个匹配项。这是可选参数。指定负值可颠倒匹配顺序。<br><br>无论函数是在加载脚本还是图表表达式中使用，以下内容都适用：<br><br><ul> <li> <p>如果 <span>field_no</span> 为正值，函数将返回一个值，从左到右识别匹配项。</p> </li> <li> <p>如果 <span>field_no</span> 为负值，函数将返回一个值，从右到左识别匹配项。</p> </li> </ul><br><br>在加载脚本中使用该函数时：<br><br><ul> <li> <p>如果在 <span>LOAD</span> 语句中使用 <span>ExtractRegEx()</span> 函数，且省略了 <span>field_no</span>，则函数生成的记录数与匹配记录数相同。</p> </li> <li> <p>如果使用 <span>ExtractRegEx()</span> 加载多个字段，且没有一个字段指定 <span>field_no</span> 参数，则会创建所有组合的 Cartesian 产品。</p> </li> </ul><br><br>在图表表达式中使用函数时：<br><br><ul> <li> <p>如果省略 <span>field_no</span>，默认值为 <code>1</code>。</p> </li> </ul> |

函数示例

| 示例 | 结果 |
| --- | --- |
| `ExtractRegEx('a,b c;1 2,3','[a-z]\|[0-9]', 1)` | 返回 `a`，即找到的第一个匹配项。 |
| `ExtractRegEx('a,b c;1 2,3','[a-z]\|[0-9]', 2)` | 返回 `b`，即找到的第二个匹配项。 |
| `ExtractRegEx('a,b c;1 2,3','[a-z]\|[0-9]', 4)` | 返回 `1`，即找到的第四个匹配项。 |
| `ExtractRegEx('abc','a\|b',-1)` | 返回 `b`。指定负值时，匹配次数将反向计算。 |
| `ExtractRegEx('A,B C;1 2,3','[a-c]\|[4-9]')` | 返回空值，因为 ExtractRegEx() 区分大小写，而不区分大小写的变量没有使用。 |
| `ExtractRegExI('A,B C;1 2,3','[a-c]\|[4-9]')` | 返回 `A`，因为使用的是不区分大小写的变体 ExtractRegExI()。 |

## 适用场景

您可以使用 Extract RegEx() 从可能还包含其他信息的数据（例如，自由文本或 JSON 字符串）中提取您想要隔离的信息。例如：

* 从文本中提取电子邮件地址、电话号码、账号和其他信息。

* 从文本中提取数值（如货币）。

* 规范文本或数字数据的格式。

## 例 1 - 从 JSON 中提取电子邮件地址的加载脚本

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/ExtractRegEx.htm)

#### 加载脚本和结果

概览

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 表 `OrderDetails` 包含一个字段 `OrderJson`。

* `OrderJson` 字段包含订单数据的 JSON 字符串。JSON 中的格式（如缩进和换行）已被删除。订单数据包含电子邮件地址，我们希望将其提取为单独的值。

* 新表 `EmailAddresses`，在 `OrderDetails` 之后加载。在 `EmailAddresses` LOAD 语句中，我们从 `OrderDetails` 表中加载 `OrderJson` 字段，并创建一个新的已计算字段，`Email`，其中包含提取的电子邮件地址。然后丢弃 `OrderDetails`。

我们的要求：

* 特定域中的电子邮件地址：`example.com`。

* 电子邮件地址可包含任意数量的字母数字字符以及一组定义的特殊字符。

加载脚本

```
OrderDetails:

Load * Inline `
OrderJson
{"Orders":[{"order_id":"12345","customer":{"name":"John Doe","email":"john.doe@example.com"},"items":{"product":"Laptop","quantity":2,"price":1200},"total_price":2400},{"order_id":"12346","customer":{"name":"Jane Doe","email":"jane.doe@example.com"},"items":{"product":"Tablet","quantity":4,"price":400},"total_price":1600},{"order_id":"12347","customer":{"name":"Amalia Craig","email":"amalia.craig@example.com"},"items":{"product":"Desktop Computer","quantity":1,"price":1900},"total_price":1900},{"order_id":"12348","customer":{"name":"Ken Roberts","email":"ken.roberts@example.com"},"items":{"product":"Phone Charger Cable","quantity":110,"price":1900},"total_price":1210}]}
` (delimiter is '\t');

EmailAddresses:

Load OrderJson, ExtractRegEx(OrderJson, '[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@example.com') as Email Resident OrderDetails;

Drop table OrderDetails;
```

结果

加载数据并打开工作表。创建新表并将该字段添加为维度：

* `Email`

结果表

| Email |
| --- |
| amalia.craig@example.com |
| jane.doe@example.com |
| john.doe@example.com |
| ken.roberts@example.com |

如果不为 field\_no 指定参数值，所有匹配值都会被自动提取为单独的值。

## 例 2 - 从货币金额中提取数值的加载脚本

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/ExtractRegEx.htm)

#### 加载脚本和结果

概览

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 包含销售数据的表格 `Sales`。

* 在 `Sales` 表格中，有一个名为 `Amount` 的字段，其中包含以美元为单位的交易金额。这些金额以字符串表示，其中包括货币符号和代码。

* 在 `Sales` 中定义了一个自定义字段 `OrderAmountNumeric_USD`，该字段将每个金额提取为纯数值。这些数据需要用数字形式表示，以便我们在图表聚合中使用。

加载脚本

```
SET DateFormat='MM-DD-YYYY';

Sales:

Load ExtractRegEx(Amount, '[0-9]+.[0-9]{2}') as OrderAmountNumeric_USD, * Inline `

OrderID, OrderDate, Product, Amount
1, '12-27-2024', Software, $100.31 USD
2, '12-28-2024', Electronics, $513.93 USD
3, '12-29-2024', Grocery, $34.66 USD
4, '12-30-2024', Furniture, $1124.58 USD
5, '12-31-2024', Software, $95.95 USD
6, '01-01-2025', Software, $601.00 USD
7, '01-02-2025', Grocery, $1534.20 USD
8, '01-03-2025', Produce, $51.49 USD
9, '01-04-2025', Home Improvement, $176.12 USD
10, '01-05-2025', Produce, $432.77 USD
11, '01-06-2025', Software, $270.01 USD
12, '01-07-2025', Electronics, $83.85 USD
13, '01-08-2025', Furniture, $65.65 USD
14, '01-09-2025', Electronics, $1526.39 USD
15, '01-10-2025', Software, $432.44 USD
16, '01-11-2025', Furniture, $888.15 USD
17, '01-12-2025', Furniture, $300.00 USD
18, '01-13-2025', Grocery, $109.53 USD
19, '01-14-2025', Furniture, $487.97 USD
20, '01-15-2025', Software, $65.09 USD
`;
```

结果

加载数据并打开工作表。创建新表并将该字段添加为维度：

* `OrderID`

* `Amount`

* `OrderAmountNumeric_USD`

结果表

| OrderID | Amount | OrderAmountNumeric\_USD |
| --- | --- | --- |
| 1 | $100.31 USD | 100.31 |
| 2 | $513.93 USD | 513.93 |
| 3 | $34.66 USD | 34.66 |
| 4 | $1124.58 USD | 1124.58 |
| 5 | $95.95 USD | 95.95 |
| 6 | $601.00 USD | 601.00 |
| 7 | $1534.20 USD | 1534.20 |
| 8 | $51.49 USD | 51.49 |
| 9 | $176.12 USD | 176.12 |
| 10 | $432.77 USD | 432.77 |
| 11 | $270.01 USD | 270.01 |
| 12 | $83.85 USD | 83.85 |
| 13 | $65.65 USD | 65.65 |
| 14 | $1526.39 USD | 1526.39 |
| 15 | $432.44 USD | 432.44 |
| 16 | $888.15 USD | 888.15 |
| 17 | $300.00 USD | 300.00 |
| 18 | $109.53 USD | 109.53 |
| 19 | $487.97 USD | 487.97 |
| 20 | $65.09 USD | 65.09 |

## 例 3 - 从 JSON 中提取电子邮件地址的图表表达式

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/ExtractRegEx.htm)

#### 图表表达式和结果

概览

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 表 `OrderDetails` 包含一个字段 `OrderJson`。

* `OrderJson` 字段包含订单数据的 JSON 字符串。JSON 中的格式（如缩进和换行）已被删除。订单数据包含电子邮件地址，我们希望将其提取为单独的值。

我们的要求：

* 特定域中的电子邮件地址：`example.com`。

* 电子邮件地址可包含任意数量的字母数字字符以及一组定义的特殊字符。

加载脚本

```
OrderDetails:

Load * Inline `
OrderJson
{"Orders":[{"order_id":"12345","customer":{"name":"John Doe","email":"john.doe@example.com"},"items":{"product":"Laptop","quantity":2,"price":1200},"total_price":2400},{"order_id":"12346","customer":{"name":"Jane Doe","email":"jane.doe@example.com"},"items":{"product":"Tablet","quantity":4,"price":400},"total_price":1600},{"order_id":"12347","customer":{"name":"Amalia Craig","email":"amalia.craig@example.com"},"items":{"product":"Desktop Computer","quantity":1,"price":1900},"total_price":1900},{"order_id":"12348","customer":{"name":"Ken Roberts","email":"ken.roberts@example.com"},"items":{"product":"Phone Charger Cable","quantity":110,"price":1900},"total_price":1210}]}
` (delimiter is '\t');
```

结果

加载数据并打开工作表。创建一个表格，并将以下每一个表达式添加为已计算维度：

* `=ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@example.com',1)`

* `=ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@example.com',2)`

* `=ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@example.com',3)`

* `=ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@example.com',4)`

结果表

| =ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']+@example.com',1) | =ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']+@example.com',2) | =ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']+@example.com',3) | =ExtractRegEx(OrderJson,'[a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']+@example.com',4) |
| --- | --- | --- | --- |
| john.doe@example.com | jane.doe@example.com | amalia.craig@example.com | ken.roberts@example.com |

## 了解详情

* [在加载脚本和图表表达式中使用正则表达式](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/regular-expressions-qlik-analytics.htm)