0

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

(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)

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

4

1 回答 1

1

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

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

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

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

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

GenerateExpression(StringBuilder result)SearchTextTreeNode更容易:

result.Append(this.SearchText);

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

于 2012-11-05T16:34:56.683 回答