我一直在阅读文档,但似乎无法找到以下答案。我需要一个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
规则引擎在安全性,优化或性能方面如何评估两者之间有什么区别吗?
而且我知道上面的例子并不是检查地址中公寓的好方法,只是一个简单的例子,使用了大多数人都熟悉的概念。
答案 0 :(得分:5)
与Java中使用String.matches( Regex regex )
与String.contains( CharSequence charSeq )
的差异大致相同。当针对CharSequence进行评估时,需要编译和解释正则表达式;在匹配给定字符串的字符串中查找子字符串需要更少的工作量。
编写低效的正则表达式非常容易。 ".*apt.*"
将通过将所有目标字符串的字符匹配到.*
来执行,然后RE引擎将备份,再次尝试,依此类推,直到最后一次出现的apt
匹配为止。更好的是".*?apt.*"
,在检测到最左边的apt
后会继续匹配。
安全?从什么?