参数化输入是个好主意。看起来您确实在尝试做两件事:首先,您想确定用户的输入是什么,然后您想对该输入采取行动。
因此,首先,阅读用户输入的行。如果您的典型预期输入类似于,(bob AND casey) OR josh
那么在后端实现基于正则表达式的语法应该非常简单,尽管正如 juharr 所说,那样对您来说更复杂。但是,假设用户输入是 AND/OR 并按括号分组,您可能希望将其分解如下:
- 对于每个过滤单元 - 每个括号 - 您想要保存 2 条信息:被过滤的项目 (
bob
, casey
) 和运算符 ( AND
)
- 这些单位是顺序敏感的;过滤
(bob AND casey) OR josh
不同于bob AND (casey OR josh)
. 因此,您还需要更高级别的搜索顺序表示。对于(bob AND casey) OR josh
,您将根据 确定搜索的有效性{result of bob AND casey} OR {result of josh}
。
这些可能是对象。:)
当您以标准化形式进行用户输入时,您将需要对其进行完整性检查,并在您发现无法解析的内容(未闭合的括号等)时通知用户。
在通知用户之后,您才应该执行实际的文件搜索。我建议将每个搜索单元(上面的第 2 项)视为自己的“搜索”,并为搜索运算符使用switch 语句,例如
switch (operator) {
case operator.AND:
inString = fileLine.Contains(itemOne) && fileLine.Contains(itemTwo)
case operator.OR:
inString = fileLine.Contains(itemOne) || fileLine.Contains(itemTwo)
}
此外,您还需要处理比较bool AND string.Contains
和的情况bool OR string.Contains
。
如果您有类似的东西,bob AND josh OR casey
您可以进行单级线性比较,您只需将它们切碎并一次通过比较传递它们(bob and josh
返回一个布尔值,然后将该布尔值传递给一个bool OR string.Contains
操作的比较)
这种结构还意味着,如果您的范围发生变化,您不太可能获得意大利面条式代码(这意味着,您不会有不断增加的 if 语句系列),并且您可以处理不可预测的输入并在出现问题时通知用户。