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

Drools LHS Evaluation: matches vs String.contains()

我一直在通读文档,但似乎找不到以下问题的答案。我需要一个 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

规则引擎在安全性、优化或性能方面评估两者的方式有何不同?

而且我知道上面的示例并不是检查地址中公寓的好方法,它只是我头脑中的一个简单示例,使用的是大多数人都熟悉的概念熟悉.

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

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

安全吗?来自什么?