【问题标题】:Regex: getting all the hashtags and mentions used in all my documents正则表达式:获取我所有文档中使用的所有主题标签和提及
【发布时间】:2019-07-02 23:39:10
【问题描述】:

我正在使用 Kibana 控制台执行此类查询(它们是分开的:一个用于主题标签,一个用于提及)。文档集合是带有 textContent 字段的博客条目,其中可能包含 @theUserName @AnotherOne 之类的用户提及或 #helloWorld 和 #hello2 之类的主题标签。查询如下所示:

GET /xblog/_search
{
  "source": [
    "id",
    "textContent"
  ],
  "query": {
    "regexp": {
      "textContent": {
        "value": "@([^-A-Za-z0-9])",
        "flags": "ALL"
      }
    }
  }
}

但问题是它还会返回不包含@userMention 的文档。我认为正则表达式中的 @ 被视为特殊符号,但阅读文档我找不到如何转义它。

在文档 1 中,作者说你可以用双引号转义任何符号,所以我测试了:

""@"" 但我一无所获。

我还会测试我习惯的表达方式,例如: /\s([@#][\w_-]+)/g

但这会在 Kibana 中产生多个错误。我尝试根据文档更换一些零件,但仍然无法正常工作。

你能指出我正确的方向吗? 提前致谢,

【问题讨论】:

  • 你试过"\\@[^-A-Za-z0-9]"吗?或者,使用"flags": "NONE"
  • @WiktorStribiżew 写[^-A-Za-z0-9] 的另一种方式是[^[:alnum:]]。这可能是我会做的。
  • @thb ES 正则表达式不支持 POSIX 字符类

标签: regex elasticsearch kibana


【解决方案1】:

您启用了使@ 匹配整个字符串的ALL 标志,请参阅ElasticSearch regex documentation

如果您启用可选功能(见下文),那么这些字符也可能会被保留:

# @ & < > ~

然后,在任何字符串部分:

"@" 符号与任何字符串完全匹配。
使用 ANYSTRINGALL 标志启用。

由于您在这里不需要任何特殊行为,您可以简单地通过传递"flags": "NONE" 告诉引擎使用“简单”正则表达式,或者转义@"\\@([^-A-Za-z0-9])"

任何保留字符都可以使用反斜杠 "\*" 转义,包括文字反斜杠字符:"\\"

由于你需要一个完整的字符串匹配,你可能需要在两端添加.*(匹配字符串包含你的匹配):

"query": {
  "regexp": {
    "textContent": {
      "value": ".*@[^-A-Za-z0-9].*",
      "flags": "NONE"
    }
  }
}

或者

"query": {
  "regexp": {
    "textContent": {
      "value": ".*\\@[^-A-Za-z0-9].*",
      "flags": "ALL"
    }
  }
}

【讨论】:

  • 你好 Wilktor,我试过了,但它返回 0 个匹配项。所以,这两种选择都不适合我(而且我有很多带有@的文字):(
  • @gal007 你确定你使用的是正确的模式吗?我只是专注于您描述的问题,而不是寻找正确的模式,并且认为"value": "@([^-A-Za-z0-9])" 是理所当然的。它应该匹配什么?可能您想使用@[-A-Za-z0-9],而不是@[^-A-Za-z0-9]。也就是说,从上面的正则表达式中删除^
  • 您好 Wilktor,似乎没有检测到 @。我正在运行带有 "flags": "NONE" 的 ".*\\@[-A-Za-z0-9].*" 并且我有 0 个匹配项。如果我删除@,假设“value”:“.*[-A-Za-z0-9].*”,我得到了超过 30.000 个匹配项。
  • @gal007 如果您逃跑,请使用".*\\@[-A-Za-z0-9].*" 并将flags 设置为ALL
  • 即使我做 "value": ".*@[^-A-Za-z0-9].*", with "flags": "NONE",我什么也得不到
猜你喜欢
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多