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
后继续匹配。
安全吗?来自什么?
我一直在通读文档,但似乎找不到以下问题的答案。我需要一个 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
后继续匹配。
安全吗?来自什么?