# ExtractRegExGroup 脚本和图表功能

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

如果在 LOAD 语句中使用 ExtractRegExGroup() 函数，且省略了 field\_no，那么该函数将返回多条记录。如果使用 ExtractRegExGroup() 加载多个字段，则会创建所有组合的 Cartesian 产品。

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

语法：

ExtractRegExGroup (text, regex, group [, field\_no])

返回数据类型： 字符串

参数

| 参数 | 描述 |
| --- | --- |
| text | 字符串表达式，包含要在返回值中提取的文本。 |
| regex | 用于提取文本的正则表达式。 |
| group | 在复合正则表达式的情况下，组的编号。<br><br>如果正则表达式只包含一个组，请使用 ExtractRegEx() 函数代替。替代方法是使用 ExtractRegExGroup()，group 值为 `0`。<br><br>您可以指定一个负 group 值，从右向左搜索匹配项。 |
| field\_no | 要提取的匹配项的编号。当正则表达式在文本中可能有多个匹配项时，这个功能非常有用。例如，指定 `4` 提取第四个匹配项。<br><br>这是可选参数。如果未指定，默认为 1。 |

函数示例

| 示例 | 结果 |
| --- | --- |
| `ExtractRegExGroup('abc123 def456','([a-z]+)([0-9]+)',1)` | 返回 `abc`（第一场比赛的第一组）。 |
| `ExtractRegExGroup('abc123 def456','([a-z]+)([0-9]+)',1,2)` | 返回 `def`（第二场比赛的第一组）。 |
| `ExtractRegExGroup('abc123 def456','([a-z]+)([0-9]+)',2)` | 返回 `123`（第一场比赛的第二组）。 |
| `ExtractRegExGroup('abc123 def456','([a-z]+)([0-9]+)',2,2)` | 返回 `456`（第二场比赛的第二组）。 |

## 适合使用 ExtractRegExGroup 的情况

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

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

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

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

## 例 1 - 加载脚本以解析交易代码

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

#### 加载脚本和结果

概述

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

加载脚本包含：

* 一个名为 `Transactions` 的表，其中包含交易信息。使用以下语法通过交易代码获取某些详细信息：

  交易年份 - 交易来源（即在线或店内购买）- 相关配送中心

* 创建多个新字段来提取每个细节，每个字段重复使用相同的复合正则表达式。

我们的要求：

* 年份可以是四个数字的任意组合。

* ONLINE 和 INSTORE 是唯一可接受的交易源值。

* 配送中心必须正好有五个号码。

加载脚本

```
Transactions:

Load 
	recno() as RecordID,
	ExtractRegExGroup(TransactionCode,'([0-9]{4})-(ONLINE|INSTORE)-([0-9]{5})',0) as TransactionCode_Unparsed,
	ExtractRegExGroup(TransactionCode,'([0-9]{4})-(ONLINE|INSTORE)-([0-9]{5})',1) as TransactionYear,
	ExtractRegExGroup(TransactionCode,'([0-9]{4})-(ONLINE|INSTORE)-([0-9]{5})',2) as TransactionSource,
	ExtractRegExGroup(TransactionCode,'([0-9]{4})-(ONLINE|INSTORE)-([0-9]{5})',3) as TransactionDC,
* Inline `
TransactionCode, Category
2025-ONLINE-60019, Product A
2024-INSTORE-60020, Product B
2025-ONLINE-60018, Product C
2024-ONLINE-60020, Product A
2025-INSTORE-60019, Product B
2025-ONLINE-60017, Product D
`;
```

结果

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

* `RecordID`

* `TransactionCode`

* `TransactionCode_Unparsed`

* `TransactionYear`

* `TransactionSource`

* `TransactionDC`

结果表

| RecordID | TransactionCode | TransactionCode\_Unparsed | TransactionYear | TransactionSource | TransactionDC |
| --- | --- | --- | --- | --- | --- |
| 1 | 2025-ONLINE-60019 | 2025-ONLINE-60019 | 2025 | ONLINE | 60019 |
| 2 | 2024-INSTORE-60020 | 2024-INSTORE-60020 | 2024 | INSTORE | 60020 |
| 3 | 2025-ONLINE-60018 | 2025-ONLINE-60018 | 2025 | ONLINE | 60018 |
| 4 | 2024-ONLINE-60020 | 2024-ONLINE-60020 | 2024 | ONLINE | 60020 |
| 5 | 2025-INSTORE-60019 | 2025-INSTORE-60019 | 2025 | INSTORE | 60019 |
| 6 | 2025-ONLINE-60017 | 2025-ONLINE-60017 | 2025 | ONLINE | 60017 |

这些结果突出说明了 group 参数如何允许您在多个操作中重复使用一个正则表达式。`TransactionCode_Unparsed` 字段使用的 group 值为 0，在这种情况下不提供任何附加值，但在此显示是为了演示该函数。

## 例 2 - 加载脚本以提取业务联系信息

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

#### 加载脚本和结果

概述

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

加载脚本包含：

* 一个名为 `BusinessContactInfo` 的表格，其中包含在各公司网站上找到的公司信息。

* `ContactInfo` 是一个包含自由文本的字段，包括公司电子邮件地址和电话号码。

* 创建多个新字段来提取每个细节，每个字段重复使用相同的复合正则表达式。

我们的要求：

* 电子邮件地址必须符合一套特定的要求和语法。

* 电话号码必须是 10 位数的 NANP 电话号码。我们希望允许用括号将地区代码括起来，并允许在某些地方留出空白空间和连字符。

加载脚本

```
BusinessContactInfo:

Load
	ExtractRegExGroupI(ContactInfo, '([a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']{1,50}\.[a-zA-Z0-9!#$%^&*\-_+=~{|}\/.'']{1,50})|(\({0,1}[0-9]{3}\){0,1}[ -]*[0-9]{3}[ -]*[0-9]{4})',1,1) as CompanyEmail,
	ExtractRegExGroupI(ContactInfo, '([a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']{1,50}\.[a-zA-Z0-9!#$%^&*\-_+=~{|}\/.'']{1,50})|(\({0,1}[0-9]{3}\){0,1}[ -]*[0-9]{3}[ -]*[0-9]{4})',2,2) as CompanyPhoneNum,
* Inline `
ID	CompanyName	ContactInfo
1	Company A	Email is: Company1@example.com, Phone number is: (123) 456-7890
2	Company B	Email is: company2@test.com, Phone # is: 0123456790
3	Company C	Email is: company3@placeholder.com, Phone no. is: 234-567-8901

` (delimiter is '\t');
```

结果

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

* `CompanyName`

* `CompanyEmail`

* `CompanyPhoneNum`

结果表

| CompanyName | CompanyEmail | CompanyPhoneNum |
| --- | --- | --- |
| Company A | Company1@example.com | (123) 456-7890 |
| Company B | company2@test.com | 0123456790 |
| Company C | company3@placeholder.com | 234-567-8901 |

相同的复合正则表达式可重复用于检索不同的信息。group 参数指定要搜索正则表达式两组中的哪一组，而 field\_no 参数则指定我们要查找的整体匹配（整个字符串）。

该函数的 ExtractRegEGroupxI() 变体可确保搜索不区分大小写。

## 例 3 - 从 ISBN 编码中提取组件的加载脚本

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

#### 加载脚本和结果

概述

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

加载脚本包含：

* 创建一个变量，`ISBN_RegEx` ，用于存储我们希望用于所有提取的正则表达式。
* 一套 ISBN 代码，用于表示书店希望从多个供应商处订购的图书。

我们需要从每个 ISBN 代码中提取以下内容：

* EAN

* 组

* 注册人

* 出版物

* 校验和

加载脚本

```
SET ISBN_RegEx = 'ISBN[ ]*([0-9]{3})-([0-9]{1})-([0-9]{4})-([0-9]{4})-([0-9]{1})';

ISBN:
LOAD Supplier,
ExtractRegExGroup(Books,'$(ISBN_RegEx)',1) AS EAN,
ExtractRegExGroup(Books,'$(ISBN_RegEx)',2) AS Group,
ExtractRegExGroup(Books,'$(ISBN_RegEx)',3) AS Registrant,
ExtractRegExGroup(Books,'$(ISBN_RegEx)',4) AS Publication,
ExtractRegExGroup(Books,'$(ISBN_RegEx)',5) AS Checksum;
// Split the ISBN with the Group function in a preceding load to avoid generating a cartesian product
LOAD *,
ExtractRegEx(SupplierBooks, '$(ISBN_RegEx)') AS Books
INLINE [
Supplier, SupplierBooks
Supplier 1, ISBN 123-3-1234-1234-0 ISBN 012-2-0123-0123-4 ISBN 000-1-0123-0123-2 ISBN 234-5-2345-2345-1 ISBN 555-2-5555-5555-3 ISBN 222-4-2222-2222-2
Supplier 2, ISBN 000-0-3333-3333-3 ISBN 333-3-3333-3333-3 ISBN 555-1-5151-5151-3 ISBN 232-1-2323-2323-1 ISBN 008-0-7777-7777-3 ISBN 888-0-9999-0000-0
];
```

结果

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

* `Supplier`

* `EAN`

* `Group`

* `Registrant`

* `Publication`

* `Checksum`

结果表

| Supplier | EAN | Group | Registrant | Publication | Checksum |
| --- | --- | --- | --- | --- | --- |
| Supplier 1 | 000 | 1 | 0123 | 0123 | 2 |
| Supplier 1 | 012 | 2 | 0123 | 0123 | 4 |
| Supplier 1 | 123 | 3 | 1234 | 1234 | 0 |
| Supplier 1 | 222 | 4 | 2222 | 2222 | 2 |
| Supplier 1 | 234 | 5 | 2345 | 2345 | 1 |
| Supplier 1 | 555 | 2 | 5555 | 5555 | 3 |
| Supplier 2 | 000 | 0 | 3333 | 3333 | 3 |
| Supplier 2 | 008 | 0 | 7777 | 7777 | 3 |
| Supplier 2 | 232 | 1 | 2323 | 2323 | 1 |
| Supplier 2 | 333 | 3 | 3333 | 3333 | 3 |
| Supplier 2 | 555 | 1 | 5151 | 5151 | 3 |
| Supplier 2 | 888 | 0 | 9999 | 0000 | 0 |

## 例 4 - 提取业务联系信息的图表表达式（与 ExtractRegEx() 比较）

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

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

概述

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

加载脚本包含：

* 一个名为 BusinessContactInfo 的表格，其中包含在各公司网站上找到的公司信息。

* ContactInfo 是一个包含自由文本的字段，包括公司电子邮件地址和电话号码。我们希望用图表表达式提取每个电子邮件地址和电话号码。

我们的要求：

* 电子邮件地址必须符合一套特定的要求和语法。

* 电话号码必须是 10 位数的 NANP 电话号码。我们希望允许用括号将地区代码括起来，并允许在某些地方留出空白空间和连字符。

加载脚本

```
BusinessContactInfo:

Load * Inline `
ID	CompanyName	ContactInfo
1	Company A	Email is: Company1@example.com, Phone number is: (123) 456-7890
2	Company B	Email is: company2@test.com, Phone # is: 0123456790
3	Company C	Email is: company3@placeholder.com, Phone no. is: 234-567-8901

` (delimiter is '\t');
```

结果

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

* CompanyName

在表格中添加以下计算维度：

* 

  ```
  =ExtractRegExGroupI(ContactInfo, '([a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']{1,50}\.[a-zA-Z0-9!#$%^&*\-_+=~{|}\/.'']{1,50})|(\({0,1}[0-9]{3}\){0,1}[ -]*[0-9]{3}[ -]*[0-9]{4})',1,1)
  ```

* 

  ```
  =ExtractRegExGroupI(ContactInfo, '([a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']+@[a-zA-Z0-9!#$%^&*-_+=~{|}\/.'']{1,50}\.[a-zA-Z0-9!#$%^&*\-_+=~{|}\/.'']{1,50})|(\({0,1}[0-9]{3}\){0,1}[ -]*[0-9]{3}[ -]*[0-9]{4})',2,2)
  ```

结果表

| CompanyName | =ExtractRegExGroupI(ContactInfo, '([a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']+@[a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']{1,50}\.[a-zA-Z0-9!#$%^&\*\-\_+=~{\|}\/.'']{1,50})\|(\({0,1}[0-9]{3}\){0,1}[ -]\*[0-9]{3}[ -]\*[0-9]{4})',1,1) | =ExtractRegExGroupI(ContactInfo, '([a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']+@[a-zA-Z0-9!#$%^&\*-\_+=~{\|}\/.'']{1,50}\.[a-zA-Z0-9!#$%^&\*\-\_+=~{\|}\/.'']{1,50})\|(\({0,1}[0-9]{3}\){0,1}[ -]\*[0-9]{3}[ -]\*[0-9]{4})',2,2) |
| --- | --- | --- |
| Company A | Company1@example.com | (123) 456-7890 |
| Company B | company2@test.com | 0123456790 |
| Company C | company3@placeholder.com | 234-567-8901 |

相同的复合正则表达式可重复用于检索不同的信息。group 参数指定要搜索正则表达式两组中的哪一组，而 field\_no 参数则指定我们要查找的整体匹配（整个字符串）。

该函数的 ExtractRegEGroupI() 变体可确保搜索不区分大小写。

## 例 5 - URL 解析（与 ExtractRegEx() 比较）

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

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

概述

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

加载脚本包含：

* 一个名为 Correspondence 的表，其中一个名为 EmailBody 的字段包含电子邮件信息文本。

* 包含网络 URL 的电子邮件内容。

我们希望将第二个 URL（如果存在）提取为以下组件：

* 完整网址

* 规程

* 域

* 路径

我们希望使用一个正则表达式来控制所有提取。

加载脚本

```
Correspondence:

Load * Inline `
ID	EmailBody
1	Thanks again for this morning's meeting! You can find the meeting minutes posted here: https://example.com/resourceexample. If you still have any questions, always feel free to ask me or one of the other team members. Here are a few learning resources that might help you: http://www.example.ca/training1.pptx http://www.example.ca/training2.pptx http://www.example.ca/training3.pptx Thanks again!
2	Hi, you'll want to visit our company website for that, it's available at https://www.example.se.
3	Hello all, I just wanted to let you know that our online stores are now up and running! I couldn't be more excited. We are already seeing quite a bit of traffic and volume sold, which is very promising! For Product A, go to https://www.examplestore1.com/products. For Product B, you'll want go to https://www.examplestore2.com/products. Product C, go check out https://www.examplestore3.com/products. Cheers!

` (delimiter is '\t');
```

结果

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

* ID

添加以下计算维度：

* URL 2：

  ```
  =ExtractRegEx(EmailBody,'([a-zA-Z0-9]+):\/\/(([a-zA-Z0-9]+\.)*([a-zA-Z0-9]+)\.([a-zA-Z0-9]+))((\/[a-zA-Z0-9]+)*(\/([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)?))?',2)
  ```

* URL 2 协议：

  ```
  =ExtractRegExGroup(EmailBody,'([a-zA-Z0-9]+):\/\/(([a-zA-Z0-9]+\.)*([a-zA-Z0-9]+)\.([a-zA-Z0-9]+))((\/[a-zA-Z0-9]+)*(\/([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)?))?',1,2)
  ```

* URL 2 域名：

  ```
  =ExtractRegExGroup(EmailBody,'([a-zA-Z0-9]+):\/\/(([a-zA-Z0-9]+\.)*([a-zA-Z0-9]+)\.([a-zA-Z0-9]+))((\/[a-zA-Z0-9]+)*(\/([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)?))?',2,2)
  ```

* URL 2 路径：

  ```
  =ExtractRegExGroup(EmailBody,'([a-zA-Z0-9]+):\/\/(([a-zA-Z0-9]+\.)*([a-zA-Z0-9]+)\.([a-zA-Z0-9]+))((\/[a-zA-Z0-9]+)*(\/([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)?))?',6,2)
  ```

结果表

| ID | URL 2 | URL 2 协议 | URL 2 域名 | URL 2 路径 |
| --- | --- | --- | --- | --- |
| 1 | http://www.example.ca/training1.pptx | http | www.example.ca | /training1.pptx |
| 2 | - | - | - | - |
| 3 | https://www.examplestore2.com/products | https | www.examplestore2.com | /products |

ExtractRegEx() 返回整个 URL，而 ExtractRegExGroup() 则返回 URL 的各个部分，与我们使用的 group 值相对应。ID 值为 2 的记录只包含一个 URL，因此不会返回任何数据。

在所有图表表达式中使用相同的正则表达式来返回不同的信息。正则表达式中定义的组别细分如下。

正则表达式中的群组

| 群组号 | 正则表达式 | URL 部分 |
| --- | --- | --- |
| 1 | ([a-zA-Z0-9]+) | 规程 |
| 2 | (([a-zA-Z0-9]+\.)\*([a-zA-Z0-9]+)\.([a-zA-Z0-9]+)) | 领域（第 3、4 和 5 组） |
| 3 | ([a-zA-Z0-9]+\.)\* | 根域 |
| 4 | ([a-zA-Z0-9]+) | 顶级域 |
| 5 | ([a-zA-Z0-9]+) | 路径（第 7、8、9 和 10 组）（可选） |
| 6 | ((\/[a-zA-Z0-9]+)\*(\/([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)?))? | 子目录 |
| 7 | (\/[a-zA-Z0-9]+)\* | 文件（第 9 组和第 10 组） |
| 8 | (\/([a-zA-Z0-9]+)(\.[a-zA-Z0-9]+)?) | 文件 |
| 9 | ([a-zA-Z0-9]+) | 文件名 |
| 10 | (\.[a-zA-Z0-9]+)? | 文件扩展名（可选） |

## 了解详情

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