# 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)

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-pattern-tokenizer.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/analysis-pattern-tokenizer.html)

译文链接 : [http://www.apache.wiki/display/Elasticsearch/Pattern+Tokenizer](http://www.apache.wiki/display/Elasticsearch/Pattern+Tokenizer)

贡献者 : [陈益雷](/display/~chenyilei)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

## **输出示例**

```
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&#124;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 中， **"** 和 **\** 需要转义，因此表达式最终为:

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

```
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 ]
```