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

IndexRegExGroup() выполняет поиск во входной строке и возвращает начальную позицию n-го вхождения указанного шаблона составного регулярного выражения. Дополнительный третий аргумент count определяет значение n (1, если опущен). Позиции в строке нумеруются слева направо от 1 и далее. Если совпадение не найдено, функция возвращает 0.

Эта функция выполняет операции с регулярными выражениями, чувствительные к регистру. В качестве альтернативы можно использовать вариант IndexRegExGroupI() для выполнения операций с регулярными выражениями без учета регистра.

Синтаксис:

IndexRegExGroup (text, regex, group [, count])

Возвращаемые типы данных: целое

Аргументы

| Аргумент | Описание |
| --- | --- |
| text | Текст входной строки, в которой требуется выполнить поиск регулярного выражения. |
| regex | Регулярное выражение, которое будет использоваться для поиска входной строки. |
| group | Номер группы в случае составного регулярного выражения.<br><br>Значение group=`0` возвращает индекс всего регулярного выражения. Однако если регулярное выражение должно возвращать только индекс всего совпадения, используйте вместо этого функцию IndexRegEx().<br><br>Можно указать отрицательное значение group для поиска совпадений справа налево. |
| count | Номер совпадения. Это полезно, когда в тексте может быть найдено несколько совпадений с регулярным выражением. Например, укажите значение `4`, чтобы найти позицию четвертого совпадения.<br><br>Данный аргумент является необязательным. Если значение на задано, по умолчанию используется 1. Можно указать отрицательное значение для поиска совпадений справа налево. |

Примеры функции

| Пример | Результат |
| --- | --- |
| `IndexRegExGroup('abc123','([a-z])([0-9]+)',0)` | Возвращает `3` (начальную позицию полного регулярного выражения). |
| `IndexRegExGroup('abc123','([a-z])([0-9]+)',1)` | Возвращает `3` (начальная позиция первой группы). |
| `IndexRegExGroup('abc123','([a-z])([0-9]+)',2)` | Возвращает `4` (начальная позиция второй группы). Во входном шаблоне регулярного выражения строка `([0-9]+)` соответствует второй группе. |
| `IndexRegExGroup('ABC123','([a-z])([0-9]+)',1)` | Возвращает `0`, поскольку IndexRegExGroup() учитывает регистр. |
| `IndexRegExGroupI('ABC123','([a-z])([0-9]+)',1)` | Возвращает `3`. Используется вариант функции IndexRegExI() без учета регистра. |

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

Эта функция может использоваться в следующих случаях:

* Определение, где в больших объемах текста встречаются специфические текстовые шаблоны. Например, может потребоваться узнать, где домен адреса электронной почты используется в серии длинных сообщений электронной почты.

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

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

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/IndexRegExGroup.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,
IndexRegExGroup(Books,'$(ISBN_RegEx)',1) AS EAN,
IndexRegExGroup(Books,'$(ISBN_RegEx)',2) AS Group,
IndexRegExGroup(Books,'$(ISBN_RegEx)',3) AS Registrant,
IndexRegExGroup(Books,'$(ISBN_RegEx)',4) AS Publication,
IndexRegExGroup(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 | 6 | 10 | 12 | 17 | 22 |
| Supplier 1 | 6 | 10 | 12 | 17 | 22 |
| Supplier 1 | 6 | 10 | 12 | 17 | 22 |
| Supplier 1 | 6 | 10 | 12 | 17 | 22 |
| Supplier 1 | 6 | 10 | 12 | 17 | 22 |
| Supplier 1 | 6 | 10 | 12 | 17 | 22 |
| Supplier 2 | 6 | 10 | 12 | 17 | 22 |
| Supplier 2 | 6 | 10 | 12 | 17 | 22 |
| Supplier 2 | 6 | 10 | 12 | 17 | 22 |
| Supplier 2 | 6 | 10 | 12 | 17 | 22 |
| Supplier 2 | 6 | 10 | 12 | 17 | 22 |
| Supplier 2 | 6 | 10 | 12 | 17 | 22 |

В этом случае каждая книга содержит компоненты в одинаковых позициях.

## Пример 2: выражение диаграммы для поиска позиций URL (со сравнением IndexRegEx())

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/IndexRegExGroup.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:

  ```
  =IndexRegExGroup(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:

  ```
  =IndexRegExGroup(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:

  ```
  =IndexRegExGroup(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 |
| --- | --- | --- | --- |
| 1 | 274 | 281 | 295 |
| 2 | 0 | 0 | 0 |
| 3 | 298 | 306 | 327 |

IndexRegEx() возвращает начальную позицию полного URL-адреса, в то время как IndexRegExGroup() возвращает начальные позиции отдельных частей URL в соответствии с использованным значением group. Запись со значением `ID`, равным 2, содержит только один URL, поэтому для нее возвращаются значения 0.

Одно и то же регулярное выражение используется во всех выражениях диаграммы для возврата различной информации. Разбивка групп, определенных в регулярном выражении, выглядит следующим образом.

Группы в регулярном выражении

| Номер группы | Регулярное выражение | Часть 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/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/regular-expressions-qlik-analytics.htm)