在Strings中匹配表达式

时间:2012-11-05 16:06:28

标签: c# regex match

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

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

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

1 个答案:

答案 0 :(得分:1)

没有答案,但提示:

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

考虑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);

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