> For the complete documentation index, see [llms.txt](https://xiaoxiami.gitbook.io/elasticsearch/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaoxiami.gitbook.io/elasticsearch/ji-chu/33-analysisfen-679029/334-tokenizersff08-fen-ci-qi-ff09/pattern-tokenizerff08-mo-shi-fen-ci-qi-ff09.md).

# Pattern Tokenizer（模式分词器）

**Pattern Tokenizer** 使用正则表达式分割文本。遇到单词分隔符将文本分割为词元， 或者将捕获到匹配的文本作为词元。

默认的匹配模式时 \W+ ，遇到非单词的字符时分割文本。

> 谨防病态的正则表达式
>
> **Pattern Tokenizer**使用[Java 正则表达式](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)。
>
> 一个书写不当的正则表达式会导致运行缓慢，甚至抛出StackOverflowError 导致运行中的节点突然退出。
>
> 查看更多关于[病态的正则表达式 和 如何避免。](http://www.regular-expressions.info/catastrophic.html)

## **输出示例**

```
POST _analyze
{
  "tokenizer": "pattern",
  "text": "The foo_bar_size's default is 5."
}
```

上面的句子会生成如下的词元：

```
[ The, foo_bar_size, s, default, is, 5 ]
```

## **配置**

**Pattern Tokenizer** 有以下参数：

| `pattern` | [Java 正则表达式](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)。默认是 `\W+ 。`                                            |              |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ |
| `flags`   | Java正则表达式 [flags](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#field.summary). flag之间用管道分隔， 如\`"CASE\_INSENSITIVE | COMMENTS"。\` |
| `group`   | 将哪个捕获分组作为词元。默认是 -1。                                                                                                                        |              |

## **配置示例**

下面的例子中，我们配置**Pattern Tokenizer** 遇到逗号时分隔文本。

```
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": ","
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "comma,separated,values"
}
```

输出为：

```
[ comma, separated, values ]
```

在下一个例子中，我们配置**Pattern Tokenizer** 遇到双引号( 忽视转义的引号 \\" ) 时捕获分组。正则表达式如下：

```
"((?:\\"|[^"]|\\")*)"
```

解释：

* 起始的引号 "
* 开始捕获
  * 一个 \\"  或者其他 非" 的字符
  * 重复直到无法匹配更多的字符
* 结束的引号

在写入到 JSON 中，**"**&#x548C;**\\**&#x9700;要转义，因此表达式最终为:

```
\"((?:\\\\\"|[^\"]|\\\\\")+)\"
```

```
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "pattern",
          "pattern": "\"((?:\\\\\"|[^\"]|\\\\\")+)\"",
          "group": 1
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "\"value\", \"value with embedded \\\" quote\""
}
```

输出为：

```
[ value, value with embedded \" quote ]
```
