# IndexRegExGroup - スクリプトおよびチャート関数

IndexRegExGroup() は、入力文字列を検索し、指定された複合正規表現パターンの n 番目の出現の開始位置を返します。n の値は、オプションの 4 番目の引数 count で指定されます。省略されている場合は、1 になります。文字列内の位置は、左から右に 1 から順に番号が付けられます。一致するものが見つからない場合、関数は 0 を返します。

この関数は、大文字と小文字を区別する正規表現操作を実行します。代わりに、バリアント IndexRegExGroupI() を使用して、大文字と小文字を区別しない正規表現操作を実行することもできます。

構文:

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

戻り値データ型： 整数

引数

| 引数 | 説明 |
| --- | --- |
| text | 正規表現を検索する入力文字列テキスト。 |
| regex | 入力文字列の検索に使用する正規表現。 |
| group | 複合正規表現の場合のグループの数。<br><br>`0` の group 値では、正規表現全体のインデックスが返されます。ただし、正規表現で一致全体のインデックスのみを返す必要がある場合は、代わりに IndexRegEx() 関数を使用します。<br><br>負の group 値を指定すると、一致を右から左に検索できます。 |
| count | 一致の数。これは、テキスト内に正規表現に一致するものが複数見つかる可能性がある場合に便利です。たとえば、4 番目の一致の位置を検索するには、`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)` | 2 番目のグループの開始位置である、`4` を返します。入力正規表現パターンでは、文字列 `([0-9]+)` は 2 番目のグループに相当します。 |
| `IndexRegExGroup('ABC123','([a-z])([0-9]+)',1)` | IndexRegExGroup() は大文字と小文字を区別するため、`0` を返します。 |
| `IndexRegExGroupI('ABC123','([a-z])([0-9]+)',1)` | `3` を返します。関数の大文字と小文字を区別しないバリアント IndexRegExI() が使用されます。 |

## 使用に適しているケース

この関数のユース ケースは次のとおりです。

* 大きなテキスト本文の中で、特定のテキストパターンがどこにあるかを特定します。たとえば、一連の長いメール メッセージ全体で、メール アドレスのドメインがどこで使用されているかを知りたいとします。

* IndexRegExGroup() は特に高度なデータの変換に有効で、より長く複雑な変換の最初のステップでよく使用されます。通常、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

* Group

* Registrant

* Publication

* Checksum

ロード スクリプト

```
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 を含むメール メッセージの内容。

2 番目の URL の位置 (存在する場合) と、次のコンポーネントの位置を見つけます。

* ドメイン

* パス

すべての操作を実行するために 1 つの正規表現を使用します。

ロード スクリプト

```
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() は使用した group の値に対応する URL の個々の部分の開始位置を返します。`ID` 値が 2 のレコードには URL が 1 つしか含まれていないため、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/ja-JP/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/regular-expressions-qlik-analytics.htm)