# ExtractRegExGroup - 指令碼與圖表函數

ExtractRegExGroup() 會使用指定的複合規則運算式模式從輸入字串運算式中擷取文字。使用該函數時，請指定要在複合 Regex 中使用的群組。如果未找到相符項，則該函數將傳回空值。

如果在 LOAD 陳述式中使用 ExtractRegExGroup() 函數並且省略 field\_no，則函數將傳回多筆記錄。如果使用 ExtractRegExGroup() 載入數個欄位，則會建立所有組合的 Cartesian 產品。

此函數執行區分大小寫的 Regex 操作。您也可以使用變體 ExtractRegExGroupI() 來執行不區分大小寫的 Regex 操作。

語法：

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` (第二個相符項的第二個群組)。 |

## 使用情境

您可以使用 Extract RegEx() 從可能還包含其他資訊之資料 (例如，自由文字或 JSON 字串) 中擷取想要隔離的資訊。例如︰

* 從文字中擷取電子郵件地址、電話號碼、帳號和其他資訊。

* 從文字中擷取數值 (例如貨幣)。

* 標準化文字或數字資料的格式。

## 範例 1 – 用於剖析交易代碼的載入指令碼

[](https://help.qlik.com/en-US/sense/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 引數為多個操作重複使用單一 Regex。`TransactionCode_Unparsed` 欄位使用 group 值 0，在這種情況下不提供任何附加價值，在此處顯示僅出於示範函數之目的。

## 範例 2 – 用於擷取業務聯絡資訊的載入指令碼

[](https://help.qlik.com/en-US/sense/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/sense/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/sense/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/sense/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-TW/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/regular-expressions-qlik-analytics.htm)