【问题标题】:How to find if an input string satisfies a specific condition (which in turn is specified as a string with AND/OR clauses inside)如何查找输入字符串是否满足特定条件(又被指定为带有 AND/OR 子句的字符串)
【发布时间】:2014-09-05 15:56:55
【问题描述】:

我有一组从数据库中获取的字符串(让我们称之为“条件字符串”)。这些字符串带有括号并由 AND 或 OR 子句连接。

这些字符串(“条件字符串”)的一些示例是:-

  1. pattern_1 = (mary sam route) AND (dance run fly)
  2. 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) 输入字符串同时包含单词 birdsfly 或 (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


【解决方案1】:

您可以分两步完成:

  1. 将模式字符串转换为正确的正则表达式字符串(您可以 甚至可以通过简单的字符串替换来实现它,具体取决于 关于你的语法/规则的复杂性)
  2. 将输入字符串与构造的正则表达式模式字符串进行比较

例如

public string convertToRegExp(string pattern)
{
   string result = pattern;
   result = Regex.Replace(result, <regexp pattern matching your syntax>, <proper regexp syntax pattern>); // convert spaces to |
   result = Regex.Replace(result, <regexp pattern matching your syntax>, <proper regexp syntax pattern>); // convert ANDs
   ... // convert other rules
   return result;
}

public bool isConditionSatisfied(string input, string pattern)
{
   string rePattern1 = convertToRegExp(pattern1);
   return Regex.IsMatch(input, rePattern1);
}

【讨论】:

    【解决方案2】:

    我实现这一点的方法分两个步骤 - (1) 将表达式转换为后缀,然后 (2) 通过对每个单词使用 Regex.IsMatch 来评估后缀。对于后缀的转换和后缀的评估,我必须使用堆栈。

    【讨论】:

    • 如果您发布代码或如何解决此问题的示例,我将支持您的答案。
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多