繁体   English   中英

如何将搜索词解析为各种问题类型?

[英]How to parse a search term into the various question types?

我正在编写一个内部应用程序,我们让用户做几种不同类型的查询。

该应用程序允许用户通过以下任一键搜索数据库:

  • 员工ID
  • 名字(第一个或最后一个)
  • companyId
  • status(workingFullTime,sickLeave,maternityLeave等)

蛮力的方法是简单地为每种类型的查询创建一个webform,并有一个菜单,用户可以选择要执行的查询类型(这是ASP.NET)

但我想要的是有一个简单的文本框,用户输入查询,然后应用程序应解析查询并自动选择要发送到后端的查询类型。

例如,employeeId是一个精确格式的数字。 所以我可以做一个正则表达式来匹配它。 对于status,companyId等也是如此。

所以我的问题是,如果这里有人可以提供一些建议,如何在C#中最好地编写一个方法,它将采用一个字符串并将其与许多不同的正则表达式进行匹配。

干杯,Joakim

直接的方法是让一系列if语句依次测试每个正则表达式:

if (Regex.Match(query, regex1)) {
    HandleFirstCase(query);
} else if(Regex.Match(query, regex2)) {
    HandleSecondCase(query);
} ... 
else {
    HandleFullTextSearch();
}

更复杂的方法是数据驱动方法,您可以将正则表达式和操作存储在表中并循环遍历它们:

public class RegexAction {
    public Regex Pattern { get; private set; }
    public Action<string> Handler { get; private set; }
    public RegexAction(Regex pattern, Action<string> handler) {
        this.Pattern = pattern;
        this.Handler = handler;
    }
}

public static RegexAction[] HandlerTable = new RegexAction[] {
    new RegexAction(regex1, HandleFirstCase),
    new RegexAction(regex2, HandleSecondCase),
    new RegexAction(regex3, HandleThirdCase),
    // ...
}

foreach(RegexAction action in HandlerTable) {
    if (action.Match(query)) {
        action.Handler(query);
        break;
    }
}

这有助于将重要数据,模式和操作与测试和调用的实现分开。

我要做的只是一个OR查询:

select * from employee where employeeId = search OR name like "%search%" OR status = "search"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM