【问题标题】:How to parse a search term into the various question types?如何将搜索词解析为各种问题类型?
【发布时间】:2008-11-03 15:56:09
【问题描述】:

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

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

  • 员工 ID
  • 姓名(名字或姓氏)
  • 公司标识
  • 状态(workingFullTime、sickLeave、maternityLeave 等)

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

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

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

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

干杯, 乔金

【问题讨论】:

  • 我认为对于状态,我想要一个选择表单,因为它似乎只接受一组值。您为什么不只显示四种不同的输入表格并使用所有已填写的表格。选择查询?这样,您还可以进行组合查询。

标签: c# regex parsing


【解决方案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;
    }
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多