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

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

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

構文:

IndexRegEx (text, regex [, count])

戻り値データ型： 整数

引数

| 引数 | 説明 |
| --- | --- |
| text | 正規表現を検索する入力文字列テキスト。 |
| regex | 入力文字列の検索に使用する正規表現。 |
| count | 一致の数。これは、テキスト内に正規表現に一致するものが複数見つかる可能性がある場合に便利です。たとえば、4 番目の一致の位置を抽出するには、`4` の値を指定します。<br><br>これはオプションの引数です。指定されていない場合、既定は 1 です。負の値を指定すると、一致を右から左に検索できます。 |

関数の例

| 例 | 結果 |
| --- | --- |
| `IndexRegEx('abc123','[a-z][0-9]+')` | `3` を返します (最初の一致の開始位置)。 |
| `IndexRegEx('abc123','[a-z][0-9]+',2)` | `0` を返します (正規表現に 2 番目の一致がない)。 |
| `IndexRegEx('ABC123','[a-z][0-9]+')` | IndexRegEx() は大文字と小文字を区別するため、`0` を返します。 |
| `IndexRegExI('ABC123','[a-z][0-9]+')` | `3` を返します。関数の大文字と小文字を区別しないバリアント IndexRegExI() が使用されます。 |

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

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

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

* IndexRegEx() は特に高度なデータの変換に有効で、より長く複雑な変換の最初のステップでよく使用されます。通常、ExtractRegEx() 、MatchRegEx() 、CountRegEx() のような他の正規表現関数を使用した方が問題を簡単に解決できますが、IndexRegEx() はこれらの関数では解決できないような解決策を提供する場合もあります。

## 例 1 - ISBN で書籍を識別するロード スクリプト

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

#### ロード スクリプトと結果

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* `EmailBody` という名前の項目に、メール メッセージの内容が含まれるテーブル `ISBN`。

メール メッセージ内の自然言語から、13 桁の ISBN コードの位置をすべて見つけます。

ロード スクリプト

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

ISBN:
LOAD IndexRegEx(EmailText,'$(ISBN_RegEx)',1) AS ISBNCode1,
IndexRegEx(EmailText,'$(ISBN_RegEx)',2) AS ISBNCode2,
IndexRegEx(EmailText,'$(ISBN_RegEx)',3) AS ISBNCode3,
* INLINE `
EmailText
Hi there! I have some books that I'm interested in ordering from your distribution center. Just wanted to make sure they were in stock before I put the order in on the system - do you think you could tell me whether you have these in stock, and how many you might be able to ship us? Thanks! Item 1: ISBN 123-3-1234-1234-0. This is one I've had a really hard time getting a hold of lately. Do you think you would have 5 in stock? If not, can I put a hold on the next 5 you get? Item 2: ISBN 012-2-0123-0123-4 ... This one is not high-priority, but if you have one, I'll take it! Item 3: ISBN 000-1-0123-0123-2. Customers have been requesting this one for a long time, and we haven't had it in stock for years due to it being out of print. Any chance you might have 7 of them? Thanks!
` (delimiter is '/t/';
```

結果

データをロードしてシートを開きます。新しいテーブルを作成し、これらの項目を軸として追加します:

* `ISBNCode1`

* `ISBNCode2`

* `ISBNCode3`

結果テーブル

| ISBNCode1 | ISBNCode2 | ISBNCode3 |
| --- | --- | --- |
| 301 | 487 | 588 |

## 例 2 - セカンダリ電話番号を持つ連絡先を識別するチャートの数式

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

#### チャートの数式および結果

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* 各企業のウェブサイトに掲載されている企業情報が含まれる `BusinessContactInfo` という名前のテーブル。

* `ContactInfo` は企業の電話番号を含む項目です。複数の電話番号を利用できる企業を特定します。

要件:

* 電話番号は 10 桁の NANP 電話番号である必要があります。

* 市外局番を括弧で囲めるようにします。

* 電話番号の各セグメントの間に 1 つの空白またはハイフンを許可します。

ロード スクリプト

```
BusinessContactInfo:

Load * Inline `
ID	CompanyName	ContactInfo
1	Company A	(123) 456-7890 (023) 123-4567
2	Company B	0123456790 1357913579 0246802468
3	Company C	234-567-8901

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

結果

データをロードしてシートを開きます。新しいテーブルを作成し、この項目を軸として追加します:

* `CompanyName`

この計算軸をテーブルに追加します。

```
=if(IndexRegEx(ContactInfo, '\({0,1}[0-9]{3}\){0,1}[ -]{0,1}[0-9]{3}[ -]{0,1}[0-9]{4}', 2)=0, 'No secondary phone number(s)', 'Has secondary phone number(s)')
```

結果テーブル

| CompanyName | =if(IndexRegEx(ContactInfo, '\({0,1}[0-9]{3}\){0,1}[ -]{0,1}[0-9]{3}[ -]{0,1}[0-9]{4}', 2)=0, 'No secondary phone number(s)', 'Has secondary phone number(s)') |
| --- | --- |
| Company A | Has secondary phone number(s) |
| Company B | Has secondary phone number(s) |
| Company C | No secondary phone number(s) |

`Company A` には 1 つのセカンダリ電話番号があります。`Company B` には 2 つのセカンダリ電話番号があります。`Company C` には 3 つのセカンダリ電話番号があります。

情報メモMatchRegEx() 関数は、このようなタイプの検証ユース ケースにも役立ちます。

## 詳細を見る

* [ロード スクリプトとチャートの数式での正規表現の使用](https://help.qlik.com/ja-JP/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/regular-expressions-qlik-analytics.htm)