首页 > 解决方案 > 用于模式替换的 Java 正则表达式 - 特殊字符和大小写更改为空格

问题描述

我正在为我们的一个用例尝试 Elasticsearch 的模式字符过滤器。它使用 java 正则表达式。

我想用空格替换任何大小写更改或任何特殊字符。文档中有一些很好的例子。但是,我正在寻找一种可以完成替换工作的字符过滤器。

我一直在不同的博客中打破我的头,但没有运气:) 非常感谢这方面的任何帮助。

用空格替换任何大小写更改或任何特殊字符

例子:

Input: StackOverFlowIsAwesome
Output: Stack Over Flow Is Awesome

Input: stack_over_flow_is_awesome
Output: stack over flow is awesome

Input: stack-over-flow-is-awesome
Output: stack over flow is awesome

Input: stack#over#flow#is#awesome
Output: stack over flow is awesome

..... any special char based inputs

**this one is good, if it is possible**
Input: STACKOverFlowIsAwesome
Output: STACK Over Flow Is Awesome

我正在使用以下 2 个字符过滤器:

          "char_filter": {
            "case_char_filter": {
              "type": "pattern_replace",
              "pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
              "replacement": " "
            },
            "special_char_filter": {
              "type": "pattern_replace",
              "pattern": "[^a-zA-Z0-9]",
              "replacement": " "
            }

标签: javaregexelasticsearchregexp-replace

解决方案


你不会设置一些 char_filters 吗?

问题PatternReplaceCharFilter上的链接 显示了一个示例-

          "type": "pattern_replace",
          "pattern": "(\\d+)-(?=\\d)",
          "replacement": "$1_"

字符串格式是java源字符串格式(必须双引号\)。替换_-#设置正则表达式"[_-#]+",并将替换为" ". 给出了一个例子,表明它反复应用。

或使用MappingCharFilter - 尽管它会转换stack--overflowstack overflow(即与破折号相同的非空格)。

骆驼案例场景可能类似于文档中的示例 -

          "pattern": "\b([A-Z])",
          "replacement": " $1"

推荐阅读