正则表达式过滤器

时间:2019-02-26 07:13:26

标签: .net regex

我有以下.NET正则表达式在以下时间不起作用

  1. “ val”组中有一个空格
  2. “ val”组没有用单引号引起来

我正在寻找Regex解决方案(而不是解析器)来修改此模式以匹配上述两个问题。拥有更多Regex经验的人可以改善它吗?

(? \ w + |`。+`| \ [。+ \])\ s *(? [= <>] | LIKE)\ s *(?'?) (?(?:[\ S-[']] |(?:''))+)(?:\ k \ B)?(?:\ s *(?( ?:AND)|((?:OR))\ s *)?

REGEX STORM .Net Tester
该模式使用字符序列减法-regex101支持吗?

捕获组: 如果字段包含空格或非字母数字,则字段可以选择用坟墓(`)或方括号([])包围。

值可以用单引号(')引起来。使用两个单引号转义一个单引号。使用方括号“ [*]”和“ [%]”转义通配符“ *”和“%”。用方括号“ [[]”和“ []]”转义方括号“ [”和“]”

布尔运算符可以是OR或AND

比较运算符可以是=,<,>或LIKE

模式是Microsoft Expression Filter的简化,仅处理上述子集。

下面应该起作用的示例。
每个示例在单独的一行上。正则表达式可以在每行上多次匹配。 例如:

“ a类似于'b [*]'或[b]类似于'c's'并且d = f或e ='d'“将匹配:

  1. “一个类似'b [*]'OR”。此匹配项的组:field =“ a”,operator = LIKE,val =“ b [*]”,boolean = OR。
  2. “ [b]喜欢'c's'AND”。组:field =“ b”,operator = LIKE,val =“ c's”,boolean = AND。
  3. “ d = f OR”。组:field =“ d”,operator =“ =”,val =“ f”,boolean = OR。
  4. “ e ='d'”。群组:field =“ e”,operator =“ =”,val =“ d”,boolean =。但是正则表达式与此文本不匹配。
  

a像'b [*]'或[b]像'c's'AND d = f OR e ='d'
  [a b] ='d'
  `e f g`>'f'
  g <4
  h =''
  i ='3'
  [全名] =”
  FirstName LIKE'hello'
  [名字] ='g'
  年龄> 6
  全名=''

1 个答案:

答案 0 :(得分:1)

从此处使用.net版本可以节省大量时间和麻烦吗?

SQL parsers for .net

我必须承认,我并不是从那些解析器的经验出发,而是从人们使用正则表达式(包括年轻时的我自己)而不是解析器的HTML / CSS解析遇到的类似问题中获益。

如果采用解析器方法,它更具可读性,不易出错,更易于调试或维护,并且总时间更少。

例如:

TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmysql);
        sqlparser.sqltext = "ALTER TABLE `world`.`t1` ALTER `c1` SET DEFAULT 'abc';";
        Assert.IsTrue(sqlparser.parse() == 0);

        TAlterTableStatement alterTableStatement = (TAlterTableStatement)sqlparser.sqlstatements.get(0);
        TAlterTableOption alterTableOption = alterTableStatement.AlterTableOptionList.getAlterTableOption(0);
        Assert.IsTrue(alterTableOption.OptionType == EAlterTableOptionType.AlterColumn);
        Assert.IsTrue(alterTableOption.DefaultExpr.ToString().Equals("'abc'", StringComparison.CurrentCultureIgnoreCase));

显示如何从alter table语句中成功提取DEFAULT的值:

"ALTER TABLE `world`.`t1` ALTER `c1` SET DEFAULT 'abc';";

我确信您可以对语句执行类似的操作,只需传递您要解析的任何字符串,而不是硬编码文本即可。

很抱歉,这不是一个完整的答案(放在拼盘上,粘贴粘贴),如果我认为它可以很好地展示,我会在评论中注明。希望这样,当您看到它的简单性时,您会改变主意。

我绝不隶属于作者,如果您发现更适合自己的东西,也不建议使用它,我只是说要使用此方法并在实际操作中演示它。