Skip to main content
 首页 » 编程设计

c#之用于简化 HQL 语法的正则表达式

2024年02月24日32lvdongjie

我打算为我的 View /业务层提供将字符串形式的 HQL 查询发送到我的数据层的可能性。

但是,数据层需要分析和操作这些查询(特别是,在 where 子句中添加条件)。

支持的 HQL 查询形式是以下任意组合:

from ... 
where ... 
order by ... 

我认为这种简化的 HQL 查询应该是正则表达式,这是我定义的正则表达式:

public const string HqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+)\s*)?" 
    + @"(\bwhere\b\s*(?<WherePart>.+)\s*)?" 
    + @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+))?$"; 
 
Regex re = new Regex(Novartis.MapAdmeBs.NHibernateDAO.DAOFactory.HqlRegex, 
    RegexOptions.Singleline); 

更新:我什至尝试过使用非贪婪修饰符:

public const string HqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+?)\s*)?" 
    + @"(\bwhere\b\s*(?<WherePart>.+?)\s*)?" 
    + @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+?))?$"; 

但是,当我尝试匹配包含 where 和 order by 子句的字符串时,“order by”关键字被视为 where 子句的一部分:

Match m = re.Match("where (e.Name not like '%X') and e.StatusID not in (7, 8, 9)" 
                 + " order by e.DateCreated desc"); 
Console.WriteLine(m.Groups["WherePart"].Value); 

给予

(e.Name not like '%X') and e.StatusID not in (7, 8, 9) order by e.DateCreated desc

感谢以下任何帮助:

  • 如何修复正则表达式?
  • 有 HQL 的正则表达式吗? (谷歌搜索导致 HQL 语言的正则表达式特征)
  • 更好的想法是哪个仍然足够简单,可以在一天或更短的时间内实现?

请您参考如下方法:

HQL 没有正则表达式,因为 HQL 不是常规语言。

要进行快速修复,您可以使用 non-greedy modifier ? 对于每个 .+:

string hqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+?)\s*)?" 
    + @"(\bwhere\b\s*(?<WherePart>.+?)\s*)?" 
    + @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+?))?$"; 
 
Regex re = new Regex(hqlRegex); 
Match m = re.Match("where (e.Name not like '%X') and e.StatusID not in (7, 8, 9)" 
         + " order by e.DateCreated desc"); 
string wherePart = m.Groups["WherePart"].Value; 
Console.WriteLine(wherePart); 

结果:

(e.Name not like '%X') and e.StatusID not in (7, 8, 9) 

我还想指出,在例如 order\b\s+\bby 中包含 a 字边界是没有意义的。 r 和空白字符之间必须始终有一个单词边界,因此无需指定。

如果您希望使用 ANTLR 执行此操作,那么您可以查看文章 Working with ANTLR: HQL Grammar .