`Ctrl`+`K`

# 7.8.10. `TokenDelimit`

## 7.8.10.1. 概要

`TokenDelimit` は1つ以上の空白文字（ `U+0020` ）で分割してトークンを抽出します。たとえば、 `Hello World` は `Hello` と `World` にトークナイズされます。

`TokenDelimit` はタグテキストに適切です。 `groonga full-text-search http` というテキストから `groonga` 、 `full-text-search` 、 `http` を抽出します。

## 7.8.10.2. 構文

`TokenDelimit` は、省略可能な引数があります。

オプションなし(1つ以上の空白文字( `U+0020` )で分割してトークンを抽出):

    TokenDelimit

区切り文字を指定:

    TokenDelimit("delimiter",  "delimiter1", delimiter", "delimiter2", ...)

正規表現で区切り文字を指定:

    TokenDelimit("pattern", pattern)

`delimiter` オプションと `pattern` オプションは同時に使用できません。

## 7.8.10.3. 使い方

## 7.8.10.4. 簡単な使い方

以下は `TokenDelimit` の例です。

実行例:

    tokenize TokenDelimit "Groonga full-text-search HTTP" NormalizerAuto
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     {
    #       "position": 0,
    #       "force_prefix": false,
    #       "value": "groonga"
    #     },
    #     {
    #       "position": 1,
    #       "force_prefix": false,
    #       "value": "full-text-search"
    #     },
    #     {
    #       "position": 2,
    #       "force_prefix": false,
    #       "value": "http"
    #     }
    #   ]
    # ]

`TokenDelimit` はオプションを指定することもできます。 `TokenDelimit` は `delimiter` オプションと `pattern` オプションを持っています。

`delimiter` オプションは、指定した文字でトークンに分割できます。

例えば、以下のように `Hello,World` は、`Hello` と `World` にトークナイズされます。

実行例:

    tokenize 'TokenDelimit("delimiter", ",")' "Hello,World"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     {
    #       "value": "Hello",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "World",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

`pattern` オプションは、正規表現でトークンを分割できます。`pattern` オプションを使うことで、不要な空白を除去することができます。

例えば、以下のように `pattern` オプションによって、 `This is a pen. This is an apple` は `This is a pen` と `This is an apple` にトークナイズされます。

通常、 `This is a pen. This is an apple.` を `.` で分割する際は、"This is an apple."の文頭に不要な空白が含まれます。

以下の例の用に `pattern` オプションを使うことで、その不要な空白を除去できます。

実行例:

    tokenize 'TokenDelimit("pattern", "\\.\\s*")' "This is a pen. This is an apple."
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     {
    #       "value": "This is a pen.",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "This is an apple.",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

## 7.8.10.5. 高度な使い方

`delimiter` オプションは、複数の区切り文字を指定することもできます。

例えば、以下のように `Hello, World` は、`Hello` と `World` にトークナイズされます。

実行例:

    tokenize 'TokenDelimit("delimiter", ",", "delimiter", " ")' "Hello, World"
    # [
    #   [
    #     0,
    #     1337566253.89858,
    #     0.000355720520019531
    #   ],
    #   [
    #     {
    #       "value": "Hello",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "World",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

`pattern` オプションを使って複雑な条件でトークンを抽出できます。

例えば、以下のように `delimiter` オプションを使って、 `これはペンですか！？リンゴですか？「リンゴです。」` を `これはペンですか` と `リンゴですか` 、 `「リンゴです。」` とトークナイズします。

実行例:

    tokenize 'TokenDelimit("pattern", "([。！？]+(?![）」])|[\\r\\n]+)\\s*")' "これはペンですか！？リンゴですか？「リンゴです。」"
    # [
    #   [
    #     0,
    #     1545179416.22277,
    #     0.0002887248992919922
    #   ],
    #   [
    #     {
    #       "value": "これはペンですか",
    #       "position": 0,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "リンゴですか",
    #       "position": 1,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     },
    #     {
    #       "value": "「リンゴです。」",
    #       "position": 2,
    #       "force_prefix": false,
    #       "force_prefix_search": false
    #     }
    #   ]
    # ]

上記の正規表現の末尾の `\\s*` は、区切り文字の後ろの0個以上の空白にマッチします。

`[。！？]+` は、1個以上の `。` または `！`、 `？` にマッチします。例えば、 `[。！？]+` は `これはペンですか！？` の `！？` にマッチします。

`(?![）」])` は否定先読みです。 `(?![）」])` は `）` または `」` にマッチしない場合にマッチします。否定先読みは直前の正規表現と合わせて解釈します。

したがって、 `[。！？]+(?![）」])` を解釈します。

`[。！？]+(?![）」])` は、`。` または `！`、 `？` の後ろに `）` または `」` が無い場合にマッチします。

つまり、 `[。！？]+(?![）」])` は、 `これはペンですか。` の `。` にマッチしますが、 `「リンゴです。」` の `。` にはマッチしません。 `。` の後ろに `」` があるためです。

`[\\r\\n]+` は、1個以上の改行文字にマッチします。

まとめると、 `([。！？]+(?![）」])|[\\r\\n]+)\\s*` は、 `。` と `！` と `？`、 改行文字を区切り文字としています。ただし、 `。` または `!`、 `？` の後ろに `）` または `」` がある場合は、 `。` や `！`、 `？` は区切り文字としません。

## 7.8.10.6. 引数

### 7.8.10.6.1. 省略可能引数

省略可能引数は2つあります。 `delimiter` と `pattern` です。

#### 7.8.10.6.1.1. `delimiter`

指定した1つ以上の文字でトークンを分割します。

区切り文字には、1つ以上の文字を指定できます。

#### 7.8.10.6.1.2. `pattern`

正規表現を使って、トークンを分割します。

## 7.8.10.7. 参考

- tokenize