Exemple #1
0
 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);
                }
            });
        }
Exemple #3
0
        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();
            }
        }
Exemple #4
0
        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];
        }