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

时间:2015-06-10 11:41:40

标签: drools

我一直在阅读文档,但似乎无法找到以下答案。我需要一个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 个答案:

答案 0 :(得分:5)

与Java中使用String.matches( Regex regex )String.contains( CharSequence charSeq )的差异大致相同。当针对CharSequence进行评估时,需要编译和解释正则表达式;在匹配给定字符串的字符串中查找子字符串需要更少的工作量。

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

安全?从什么?