对于像工具一样的数据丢失防护,我有一个要求,我需要查找不同类型的数据,如驱动程序的许可证号,社会安全号,名称等。虽然大多数这是基于模式的,因此可以查找使用模式匹配正则表达式,名称恰好是一个非常广泛的类别。几乎可以有任何可以形成名称的字符集。但是,为了使它成为有意义的查找,我想我应该只针对定义的名称字典查找它们。这就是我的想法。
提供名称字典作为配置项。对于每个用例,这看起来更合理,名称可能因地理区域而异。我正在寻找在Java中执行此操作的最佳实践。基本上这些都是问题 -
答案 0 :(得分:2)
查看concurrent-trees和CQEngine个项目。
答案 1 :(得分:1)
您可以使用全文索引或在线搜索来完成。
我更喜欢全文索引,例如与Lucene。您必须定义索引器如何在文本中找到标记(通过定义标记模式和非关注模式)。
另一种方法是搜索多个字符串(名称)。请注意,对于多个字符串有特殊的搜索算法,并且大多数算法都有一个首选范围的参数(模式大小,字母大小,要搜索的模式数)。您可以在StringBench获得一些展示次数。
编辑:
可以使用基于DFA的自动机进行多种模式/字符串的高效搜索。
我第一次有效搜索文字时选择dk.brics.automaton。它的自动机效率非常高,但它的优化是为了匹配而不是搜索(搜索以天真的方式进行)。
然后我转移到我自己的实现rexlex。它是基于DFA的,但比金砖四国略慢。搜索算法不像金砖四国那样天真,但增加了一些开销。
您找到link to a benchmark比较两者。基准测试可视化基于DFA的正则表达式的问题 - 如果正则表达式很大,编译这样的DFA的时间会非常昂贵。
我目前赞成多字符串/模式搜索的stringandchars实现。它专注于搜索性能,但我不知道它与上述解决方案的比较。在上面的解决方案中,在文本中搜索多个正则表达式模式的最常见情况将更加高效。