public static string GetSQLLike(LikePattern pattern) => pattern.Joined("", x => x.Match( ch => MapSqlSpecialCharacters(ch), wildcard => (wildcard == Wildcards.SingleCharacter ? '_' : '%').ToString(), patternGroup => { string ret = ""; if (patternGroup.IsPositive) { ret += '^'; } return(ret + patternGroup.Joined("", range => range.start == range.end ? $"{range.start}" : $"{range.start}-{range.end}")); } ));
public static void RunTest(string pattern, LikePattern expected) { var actual = ParseVBLike(pattern); Assert.Equal(expected.Count, actual.Count); expected.Zip(actual).ForEachT((expected1, actual1) => { if (expected1.IsT2 && actual1.IsT2) { Assert.Equal(expected1.AsT2.IsPositive, actual1.AsT2.IsPositive); Assert.Equal(expected1.AsT2.ToList(), actual1.AsT2.ToList()); } else { Assert.Equal(expected1, actual1); } }); }
public static string ApplyPattern(string value, LikePattern pattern) { switch (pattern) { case LikePattern.StartsWith: return(StartsWith(value)); case LikePattern.EndsWith: return(EndsWith(value)); case LikePattern.Contains: return(Contains(value)); default: throw new InvalidOperationException(); } }
public static LikePattern ParseVBLike(string pattern) { var ret = new LikePattern(); int pos = -1; int lastPos = pattern.Length - 1; PatternGroup currentGroup = null; char ch; while (pos < lastPos) { advanceChar(); if (currentGroup == null) { if (ch == '?') { ret.Add(Wildcards.SingleCharacter); } else if (ch == '*') { ret.Add(Wildcards.MultipleCharacter); } else if (ch == '#') { ret.Add(new PatternGroup() { { '0', '9' } }); } else if (ch == '[') { currentGroup = new PatternGroup(); if (nextChar() == '!') { advanceChar(); currentGroup.IsPositive = false; } } else { ret.Add(ch); } } else { var start = ch; if (ch == ']') { ret.Add(currentGroup); currentGroup = null; } else if (nextChar() == '-' && nextChar(2) != ']') { advanceChar(); advanceChar(); currentGroup.Add(start, ch); } else { currentGroup.Add(ch, ch); } } } if (currentGroup != null) { throw new ArgumentException("Missing group end."); } return(ret); void advanceChar(bool ignoreEnd = false) { pos += 1; if (pos <= lastPos) { ch = pattern[pos]; } else if (ignoreEnd) { ch = '\x0'; } else { throw new ArgumentException("Unexpected end of text"); } } char nextChar(int offset = 1) => pos + offset > lastPos ? '\x0' : pattern[pos + offset]; }