【问题标题】:Match expressions in Strings匹配字符串中的表达式
【发布时间】:2012-11-05 16:06:28
【问题描述】:

我在这里有一个数据库,其中包含我需要应用于一堆字符串的某些规则,它们是可以出现在字符串中的表达式。它们表示为

(word1 AND word2) OR (word3) 

我无法对它们进行硬编码(因为它们可能会在数据库中更改),因此我考虑以编程方式将这些表达式转换为正则表达式模式。

有没有人做过这样的任务,或者知道如何以最好的方式做到这一点? 我不确定如何处理更复杂的表达式,如何将它们分开等等。

编辑:我在 VisualStudio / .NET 中使用 C#。

数据基本上是目录路径,客户想要组织他们的文档,所以我拥有的字符串是路径,数据库中的表达式可能如下所示:

(office OR headquarter) AND (official OR confidential)

所以如果文件的目录路径包含office和confidential,它应该匹配。

希望这能让它更清楚。

编辑2:

这里有一些虚拟的例子:

路径可能如下所示:

c:\documents\official\johnmeyer\court\out\letter.doc
c:\documents\internal\appointments\court\in\september.doc
c:\documents\official\stevemiller\meeting\in\letter.doc

还有这样的表达方式:

(meyer or miller) AND (court OR jail)

所以这个表达式将匹配第一个路径/文件,但不匹配第二个和第三个。

【问题讨论】:

  • 哪种语言,你将如何使用表达式?
  • 您能否提供几行实际数据以及您希望正则表达式模式匹配的内容?
  • 你能告诉我们应该匹配的示例列表和不应该匹配的其他列表吗?
  • 很遗憾,该列表包含机密内容。
  • 老兄,我们不需要您的机密资料,而是您可以生成的虚拟示例以使您的问题更易于理解...

标签: c# regex match


【解决方案1】:

没有答案,但是一个很好的提示:

您拥有的表达式是由括号构成的实际树。您需要一个stack machine来将文本解析为(二进制)树结构,其中每个节点是ANDOR 元素,叶子是单词。 之后,您可以使用深度优先搜索遍历树并在读取子树之前/之后根据需要添加前缀和后缀数据,从而以所需的任何语言简单地构建正则表达式。

考虑一个abstract class TreeNode 有一个方法GenerateExpression(StringBuilder result)。 每个实际的 TreeNode 项将是 CombinationTreeNode(带有 CombinationMode And/Or)或 SearchTextTreeNode(带有 SearchText 属性)。

CombinationTreeNode 的 GenerateExpression(StringBuilder result) 看起来像这样:

result.Append("(");
rightSubTree.GenerateExpression(result);
result.Append(") " + this.CombinationMode.ToString() + " (");
rightSubTree.GenerateExpression(result);
result.Append(")");

SearchTextTreeNode 的 GenerateExpression(StringBuilder result) 要容易得多:

result.Append(this.SearchText);

当然,您的代码将生成一个正则表达式,而不是像我的那样输入文本。

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2015-04-26
    • 1970-01-01
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多