# ExtractRegExGroup — функция скриптa и диаграммы

ExtractRegExGroup() извлекает текст из входного строкового выражения, используя указанный шаблон составного регулярного выражения. При использовании функции укажите группу, которую следует использовать в составном регулярном выражении. Функция возвращает нулевое значение, если не найдено ни одного совпадения.

Если используется функция ExtractRegExGroup() в операторе LOAD, а field\_no опускается, то функция будет возвращать несколько записей. Если с помощью функции ExtractRegExGroup() загружено несколько полей, будет создано декартово произведение всех возможных комбинаций.

Эта функция выполняет операции с регулярными выражениями, чувствительные к регистру. В качестве альтернативы можно использовать вариант 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` (вторая группа второго совпадения). |

## Когда это следует использовать

Можно использовать 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 позволяет многократно использовать одно и то же регулярное выражение для нескольких операций. Поле `TransactionCode_Unparsed`, которое использует значение group=0, в данном случае не дает никакого дополнительного значения, но показано здесь для демонстрации функции.

## Пример 2: скрипт загрузки для извлечения контактной информации о предприятий

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

#### Скрипт загрузки и результаты

Обзор

Откройте редактор загрузки данных и добавьте приведенный ниже скрипт загрузки в новый раздел.

Скрипт загрузки содержит следующее:

* Таблица с именем `BusinessContactInfo`, содержащая информацию о компаниях, которая была найдена на веб-сайте каждой компании.

* `ContactInfo` ― это поле, содержащее произвольный текст, включая адреса электронной почты и номера телефонов компаний.

* Создание нескольких новых полей для извлечения каждого элемента сведений, в каждом из которых используется одно и то же составное регулярное выражение.

Требования:

* Адреса электронной почты должны соответствовать определенному набору требований и синтаксису.

* Телефонные номера должны быть телефонными номерами стандарта NANP (Североамериканский план телефонной нумерации), состоящими из 10 цифр. Требуется разрешить заключение кода области в скобки, а также разрешить пустые пробелы и дефисы в некоторых местах.

Скрипт загрузки

```
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 ― это поле, содержащее произвольный текст, включая адреса электронной почты и номера телефонов компаний. Необходимо извлечь каждый адрес электронной почты и номер телефона с помощью выражений диаграммы.

Требования:

* Адреса электронной почты должны соответствовать определенному набору требований и синтаксису.

* Телефонные номера должны быть телефонными номерами стандарта NANP (Североамериканский план телефонной нумерации), состоящими из 10 цифр. Требуется разрешить заключение кода области в скобки, а также разрешить пустые пробелы и дефисы в некоторых местах.

Скрипт загрузки

```
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, если он есть, в следующие компоненты:

* Полный 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)
  ```

Таблица результатов

| Идентификатор | 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/ru-RU/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/regular-expressions-qlik-analytics.htm)