【发布时间】:2014-09-05 15:56:55
【问题描述】:
我有一组从数据库中获取的字符串(让我们称之为“条件字符串”)。这些字符串带有括号并由 AND 或 OR 子句连接。
这些字符串(“条件字符串”)的一些示例是:-
pattern_1 = (mary sam route) AND (dance run fly)pattern_2 = (birds AND fly) OR (athlete AND run)
然后我得到一组输入字符串(如电子邮件等),我想查看输入字符串是否满足“条件字符串”指定的条件。换句话说,我想编写一个类似isConditionSatisfied(string, string) 的函数,如果some_input_string 满足pattern_1 指定的条件,即如果输入字符串包含@987654327 中的任何一个单词,则当调用isConditionSatisfied(some_input_string, pattern_1) 时将返回true @ 并且它还包含(dance run fly) 中的任何一个词。
同样,如果满足以下任一条件,isConditionSatisfied(some_input_string, pattern_2) 应该返回 true - (a) 输入字符串同时包含单词 birds 和 fly 或 (b) 输入字符串同时包含单词 @987654332 @和run。
我的问题是 - C# 中是否有任何库可以最有效地编写我的函数isConditionSatisfied(....),而无需我将“condition_strings”分解为标记,然后检查输入字符串中的 AND/OR 条件.我一直在探索string.contains() 和Regex.IsMatch(),但我不确定它们是否支持在输入字符串中执行这种AND/OR 检查。
关于如何在 C# 中以最有效的方式编写函数 isConditionSatisfied 有什么建议,以及是否有任何现有的库可以让我更轻松地解决这类问题?
【问题讨论】:
-
不知道是否有任何库可以帮助您解决此问题,但您可以将
string.split()与 AND 或 OR 一起使用,然后比较您获得的字符串。递归调用isConditionSatisfied并弄清楚它的工作逻辑。 -
您的条件字符串是否总是采用
(A) condition (B)的形式,或者它们可以是任意长度并且可能是嵌套的(例如(A AND NOT (B OR C) AND D AND ((E AND F) OR (G AND H))))?在第二种情况下,您可能需要一个基于堆栈的解析器。 -
是后者——它可以是任意长度并且可以嵌套。我刚刚完成了这个的实现和测试。本质上,我将表达式转换为后缀,然后在每个组件上使用 Regex.IsMatch 评估后缀。对于后缀的转换以及后缀的评估,我必须按照您的建议使用堆栈
标签: c# asp.net .net regex visual-studio-2013