我这里有一个数据库,我需要应用于一堆字符串的某些规则,它们是可以在字符串中出现的表达式。它们表达为
(word1 AND word2) OR (word3)
我无法硬编码(因为它们可能在数据库中被更改),所以我想到以编程方式将这些表达式转换为正则表达式模式。
有没有人完成这样的任务,或者对如何以最佳方式做到这一点有所了解? 我不确定如何处理更复杂的表达,如何将它们分开等等。
编辑:我在VisualStudio / .NET中使用C#。
数据基本上是目录路径,客户希望将文档组织起来,所以我所拥有的字符串是路径,数据库中的表达式可能如下所示:
(office OR headquarter) AND (official OR confidential)
因此,如果文件的目录路径包含office和机密,则它应该匹配。
希望这更清楚。
EDIT2:
下面是一些虚假的例子:
路径看起来像:
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)
因此,此表达式将匹配第一个路径/文件,但不匹配第二个和第三个路径/文件。
答案 0 :(得分:1)
没有答案,但提示:
您拥有的表达式是由括号构造的实际树。您需要堆栈计算机将文本解析为(二进制)树结构,其中每个节点都是AND
或OR
元素,而叶子是单词。
之后,您可以使用深度优先搜索并在阅读子树之前/之后根据需要添加前缀和后缀数据,以您需要的任何语言构建正则表达式。
考虑abstract class TreeNode
方法GenerateExpression(StringBuilder result)
。
每个实际的TreeNode项都是CombinationTreeNode
(带有CombinationMode和/或)或SearchTextTreeNode
(带有SearchText属性)。
CombinationTreeNode
的GenerateExpression(StringBuilder结果)看起来类似于:
result.Append("(");
rightSubTree.GenerateExpression(result);
result.Append(") " + this.CombinationMode.ToString() + " (");
rightSubTree.GenerateExpression(result);
result.Append(")");
SearchTextTreeNode
的GenerateExpression(StringBuilder结果)更容易:
result.Append(this.SearchText);
当然,您的代码将生成正则表达式而不是输入文本,就像我的那样。