private string TranslateToNETRegex(VBALikeParser.LikePatternStringContext likePattern) { StringBuilder regexStr = new StringBuilder(); foreach (var element in likePattern.likePatternElement()) { if (element.likePatternChar() != null) { regexStr.Append(element.likePatternChar().GetText()); } else if (element.QUESTIONMARK() != null) { regexStr.Append("."); } else if (element.HASH() != null) { regexStr.Append(@"\d"); } else if (element.STAR() != null) { regexStr.Append(@".*?"); } else { var charlist = element.likePatternCharlist().GetText(); if (charlist.StartsWith("[!")) { charlist = "[^" + charlist.Substring(2); } regexStr.Append(charlist); } } // Full string match, e.g. "abcd" should NOT match "a.c" var regex = "^" + regexStr.ToString() + "$"; return regex; }
public override IValue Evaluate() { var expr = _expression.Evaluate(); var pattern = _pattern.Evaluate(); if (expr == null || pattern == null) { return null; } var exprStr = expr.AsString; var patternStr = pattern.AsString; var stream = new AntlrInputStream(patternStr); var lexer = new VBALikeLexer(stream); var tokens = new CommonTokenStream(lexer); var parser = new VBALikeParser(tokens); var likePattern = parser.likePatternString(); var regex = TranslateToNETRegex(likePattern); return new BoolValue(Regex.IsMatch(exprStr, regex)); }
/// <summary> /// Parses the given like pattern. /// </summary> /// <param name="likePattern">The like pattern of the like operation (e.g. in "a Like b" the b)</param> /// <returns>The root of the parse tree.</returns> public VBALikeParser.LikePatternStringContext Parse(string likePattern) { var stream = new AntlrInputStream(likePattern); var lexer = new VBALikeLexer(stream); var tokens = new CommonTokenStream(lexer); var parser = new VBALikeParser(tokens); //parser.AddErrorListener(new ExceptionErrorListener()); VBALikeParser.CompilationUnitContext tree; try { parser.Interpreter.PredictionMode = PredictionMode.Sll; tree = parser.compilationUnit(); } catch (Exception ex) { Logger.Warn(ex, "SLL mode failed for {0}. Retrying using LL.", likePattern); tokens.Reset(); parser.Reset(); parser.Interpreter.PredictionMode = PredictionMode.Ll; tree = parser.compilationUnit(); } return(tree.likePatternString()); }