提问者:小点点

Drools LHS评估:匹配vs String.包含()


我一直在阅读文档,但似乎找不到以下问题的答案。我需要一个Drools规则来检查一个字符串是否包含另一个字符串。我想知道这样写会有什么不同(如果有的话):

rule "String Matches"
   when
      Address(street matches ".*apt.*")
   then
      log.info("Someone likely lives in an apartment");
end

而不是像这样编写相同的逻辑:

rule "String Contains"
   when
      Address(street.contains("apt"))
   then
      log.info("Someone likely lives in an apartment");
end

规则引擎将如何评估两者在安全性、优化性或性能方面有什么区别吗?

我知道上面的例子不是一个很好的方法来检查地址中的公寓,只是一个简单的例子,用一个大多数人都熟悉的概念。


共1个答案

匿名用户

区别就像在Java中使用String.匹配(正则表达式)String.包含(CharSequence charSeq)一样。根据CharSequence计算正则表达式时需要编译和解释;在与给定字符串匹配的字符串中查找子字符串需要更少的努力。

编写一个低效的正则表达式是相当容易的。".*apt.*"将通过将目标字符串的所有字符匹配到.*来执行,然后RE引擎将备份,重试,依此类推,直到匹配到最后一次出现的apt。更好的是". *? apt.*",它将在检测到最左边的apt后继续匹配。

安全?从什么?