我正在寻找一个好的数据结构来表示形式的字符串:
Domain:Key1=Value1,Key2=Value2...
每个“域名”都可以包含以下模式字符 - *
,?
(*
- 0个或更多字符,?
- 0或1个字符)
每个“密钥”都可以包含以下模式字符 - *
,?
(*
- 0个或更多字符,?
- 0或1个字符)
每个“值”都可以包含以下模式字符 - *
,?
(*
- 0个或更多字符,?
- 0或1个字符)
示例:
JBoss:*
*:*
JBoss:type=ThreadPool,*
JBoss:type=Thread*,*
JB*:name=http1,type=ConnectionPool
如果您熟悉JMX ObjectName,那么基本上这就是ObjectName模式。
我正在寻找方法来轻松存储与每种模式相对应的规则,并能够快速删除,更新和添加新规则。
我最初使用的是Prefix Trie,但却遇到了模式字符*
,?
。
答案 0 :(得分:1)
我认为最简单的方法是构建一个NFA类似的trie,它允许转换到多个状态。当然,这增加了另一个数据结构的复杂性,该数据结构在给定一组要匹配的字符的情况下映射到多个状态。例如,用你的例子:
JBoss:*
*:*
JBoss:type=ThreadPool,*
JBoss:type=Thread*,*
JB*:name=http1,type=ConnectionPool
假设您尝试匹配JBoxx:name=*
当您匹配子字符串JBo
时,您需要一个数据结构来保存状态JBo
和JB*
以及*
,因为此时您有三个分支。当x
进入时,您可以放弃JBo
路线,因为它已经死路一条,并使用JB*
和*
。简单的实现是在任何给定的时间都有一组可能的匹配状态,并在每个状态上尝试下一个字符。你还需要一种方法来解决多个匹配(如本例所示) - 也许就像最长匹配一样简单?
当您将trie视为NFA而不是广为接受的DFA格式时,这一切似乎都有意义。希望有所帮助。
答案 1 :(得分:0)
我相信你想使用rope
答案 2 :(得分:0)
您可以查看其他帖子:Efficient data structure for word lookup with wildcards
或者此网站:Wildcard queries
第二个站点以“我们因此可以处理包含使用两个B树的单个*符号的通配符查询结束,正常的B树和反向B树。”。
这对你来说可能是最重要的,但值得一读。
祝你好运