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

时间:2008-11-03 15:56:10

标签: c# regex parsing

我正在编写一个内部应用程序,我们让用户可以执行一些不同类型的查询。

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

  • EMPLOYEEID
  • 名称(第一个或最后一个)
  • companyId
  • status(workingFullTime,sickLeave,maternityLeave等)

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

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

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

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

干杯, 乔金姆

3 个答案:

答案 0 :(得分:1)

直截了当的方法是依次测试每个正则表达式的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;
    }
}

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

答案 1 :(得分:1)

答案 2 :(得分:1)

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

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