我正在尝试找到单词之间的匹配,并使用Elasticsearch进行简化。在
假设我有输入字shmp
(在ES中索引为shampoo
),我生成以下regex s.*?h.*?m.*?p.*?
,并执行以下查询DSL:
{
"query": {
"regexp": { "name": "s.*?h.*?m.*?p.*?" }
}
}
有没有一种方法可以同时进行模糊搜索(例如max_expansions 1),使s.*h.*?n.*?p.*?
匹配?在
然而,我不确定这是最好的方法,也许有一些工作我没有想到。在
Tags:
(..*?h.*?m.*?p.*?|s.*?..*?m.*?p.*?|s.*?h.*?..*?p.*?|s.*?h.*?m.*?..*?)
https://regex101.com/r/qV9cW6/1
手工生成有点麻烦,因为它将涉及一个OR语句,其项数等于输入中的字母数。但是,如果使用循环,为任意输入生成循环也不会太糟糕。它的工作方式是允许4个字符中的任何一个
shmp
是不同的字符,但不能超过一个。在这个解决方案与@ezig的答案不同。另一种看法:p
Regex101
这个正则表达式的基本工作方式是每个字母都有一个部分。对于这个解释,我们将使用
s
,因为它是第一个。在S:
([^s](?=.*?h.*?m.*?p)|s)
这意味着“这里允许不匹配
s
,假设字符串的其余部分将正确匹配,否则我们需要在此处匹配s
”为什么这个正则表达式会比@ezig的答案慢得多,我们知道第一个字符将遵循模糊匹配的规则,并且我们不必对附加字符太过聪明。在
H:
([^h](?=.*?m.*?p)|h)
这一节之所以简短,是因为我们知道如果
s
不匹配,我们根本就不会匹配字符串,但因为我们在这里检查h
,这可能不同于我们之前知道它必须匹配s
。这意味着“如果字符串的其余部分正确匹配,那么我们可以匹配h
”之外的内容。在相关问题 更多 >
编程相关推荐