我一直在阅读文档,但似乎找不到以下问题的答案。我需要一个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
规则引擎将如何评估两者在安全性、优化性或性能方面有什么区别吗?
我知道上面的例子不是一个很好的方法来检查地址中的公寓,只是一个简单的例子,用一个大多数人都熟悉的概念。
区别就像在Java中使用String.匹配(正则表达式)
与String.包含(CharSequence charSeq)
一样。根据CharSequence计算正则表达式时需要编译和解释;在与给定字符串匹配的字符串中查找子字符串需要更少的努力。
编写一个低效的正则表达式是相当容易的。".*apt.*"
将通过将目标字符串的所有字符匹配到.*
来执行,然后RE引擎将备份,重试,依此类推,直到匹配到最后一次出现的apt
。更好的是". *? apt.*"
,它将在检测到最左边的apt
后继续匹配。
安全?从什么?