Lucene正则表达式中的单词边界

6

你是否也想返回包含4个文本单词和wordb字符串(如果word是你要查找的内容)? - Wiktor Stribiżew
不,只需 word - dimid
如果您正在使用分词器,可以使用Java正则表达式。然后支持\b。请参阅文档 - Wiktor Stribiżew
而且我认为你可以在使用ES Lucene正则表达式时使用类似于~([A-Za-z0-9_]word|word[A-Za-z0-9_])word~([A-Za-z0-9_]word|word[A-Za-z0-9_])的东西来匹配不包含以单词字符结尾的“word”字符串,一个单词,再次是任何文本但不是单词的一部分的单词。 - Wiktor Stribiżew
2
转念一想,试试 (.*[^A-Za-z0-9_])?word([^A-Za-z0-9_].*)? - Wiktor Stribiżew
显示剩余3条评论
1个回答

11
在ElasticSearch的正则表达式中,没有直接等价于单词边界的元字符。如果“单词”以单词字符开头,则初始的\b类似于(^|[^A-Za-z0-9_]),而结尾的\b就像($|[^A-Za-z0-9_])一样,如果“单词”以单词字符结尾。

因此,我们需要确保在“单词”的前后或字符串的开头/结尾有一个非单词字符。由于默认情况下正则表达式已被锚定,因此我们只需使[^A-Za-z0-9_]在字符串的开头/结尾变为可选项即可,方法是将它与.* 相邻并用一个可选的分组结构包装起来:
(.*[^A-Za-z0-9_])?word([^A-Za-z0-9_].*)?

详细信息

  • (.*[^A-Za-z0-9_])? - 要么是字符串的开头,要么是任何0个或多个字符(但不包括换行符,否则使用(.|\n)*),然后是除单词字符以外的任何字符(基本上是指在组内模式的1个或0次出现后跟随字符串的开头)
  • word - 一个单词
  • ([^A-Za-z0-9_].*)? - 可选的任意非单词字符序列,后跟任何0个或多个字符,随后是字符串位置的末尾(在Lucene正则表达式中默认)。

我需要做什么才能将某些特殊字符添加到边界中?这个正则表达式正确吗:(.*[^A-Za-z0-9#+&=-_])? - Florian Walther
我的正则表达式还匹配了[?,但我不想要它们。我该如何避免这种情况? - Florian Walther
1
@FlorianWalther =-_ 创建了一个范围。你需要在类的开头放置 -[^-A-Za-z0-9#+&=_] - Wiktor Stribiżew
哦,这很有道理。非常感谢你! - Florian Walther

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接