public static ICharactersRangeDefinition CreateMatching(StandardCharacterCategories range)
        {
            Guard.ArgSatisfies(range, nameof(range), p => !p.IsEmpty(), p => $"Specified category is empty ({p}).");
            Guard.ArgSatisfies(range, nameof(range), p => p.IsValid(), p => $"Specified category is not supported ({p})");

            return(new StandardCategory(range));
        }
示例#2
0
        private static bool IsCharacterFromPatternInternal(char character, StandardCharacterCategories pattern, bool positive)
        {
            var characterType = character.CategorizeByStandardPattern(positive);

            var matches = characterType != StandardCharacterCategories.None && pattern.HasFlag(characterType);
           
            return positive ? matches : !matches;
        }
示例#3
0
        public static StandardCharactersPatternType GetValidPatternType(this StandardCharacterCategories pattern)
        {
            var type = pattern.GetPatternType();

            return type != StandardCharactersPatternType.Invalid
                ? type
                : throw new ArgumentException(
                    $"Invalid pattern: Pattern contains mixed negative and positive patterns ({pattern}).");
        }
示例#4
0
        public static StandardCharacterCategories Not(this StandardCharacterCategories pattern)
        {
            var mask = (int) pattern;
            var negative = (mask & NegativePatternsShift) >> NegativePatternsShift;
            var positive = (mask & PositivePatternMask) << NegativePatternsShift;

            var negated = (StandardCharacterCategories)(negative | positive);

            return negated;
        }
示例#5
0
        public static StandardCharactersPatternType GetValidNotEmptyPatternType(this StandardCharacterCategories pattern)
        {
            var type = pattern.GetPatternType();

            return type switch
            {
                StandardCharactersPatternType.Empty => throw new ArgumentException($"Pattern is empty ({pattern})", nameof(pattern)),
                StandardCharactersPatternType.Invalid => throw new ArgumentException($"Invalid pattern: Pattern contains mixed negative and positive patterns ({pattern})."),
                _ => type
            };
        }
示例#6
0
        public static bool IsAnyCharacterFromPattern(IEnumerable<char> characters, StandardCharacterCategories pattern)
        {
            if (pattern == StandardCharacterCategories.None)
            {
                return false;
            }

            var positive = pattern.GetValidPatternType() == StandardCharactersPatternType.Positive;

            var contains = characters.Any(character => IsCharacterFromPatternInternal(character, pattern, positive));
            return contains;
        }
示例#7
0
        public static StandardCharactersPatternType GetPatternType(this StandardCharacterCategories pattern)
        {
            if (pattern == StandardCharacterCategories.None)
            {
                return StandardCharactersPatternType.Empty;
            }

            var hasNegatives = ((int) pattern & NegativePatternMask) != 0;
            if (hasNegatives)
            {
                var hasPositives = ((int) pattern & PositivePatternMask) != 0;

                return hasPositives
                    ? StandardCharactersPatternType.Invalid
                    : StandardCharactersPatternType.Negative;
            }

            return StandardCharactersPatternType.Positive;
        }
示例#8
0
        public static string ToRegexStatement(this StandardCharacterCategories pattern)
		{
            var positive = pattern.GetValidNotEmptyPatternType() == StandardCharactersPatternType.Positive;

            return ToRegexStatement(pattern, positive);
        }
示例#9
0
        private static string ToRegexStatement(this StandardCharacterCategories fullPattern, bool positiveScope)
        {
            var pattern = positiveScope ? fullPattern : fullPattern.Not();

            var simple = pattern switch
            {
				StandardCharacterCategories.UpperLetter => positiveScope ? "[A-Z]" : "[^A-Z]",
				StandardCharacterCategories.LowerLetter => positiveScope ? "[a-z]": "[^a-z]",
                StandardCharacterCategories.Letter => positiveScope ? "[A-Za-z]": "[^A-Za-z]",
                StandardCharacterCategories.LetterOrDigit => positiveScope ? @"[A-Za-z0-9]": @"[^A-Za-z0-9]",
                StandardCharacterCategories.Digit => positiveScope ? @"\d": @"\D",
				StandardCharacterCategories.Underscore => positiveScope ? @"_": "^_",

				StandardCharacterCategories.Space => positiveScope ? @"[ ]": @"[^ ]",
                StandardCharacterCategories.Tab => positiveScope ? @"\t": @"^\t",
				StandardCharacterCategories.NewLine => positiveScope ? @"\n": @"^\n",
				StandardCharacterCategories.Return => positiveScope ? @"\r": @"^\r",
				StandardCharacterCategories.LineBreak => positiveScope ? @"[\r\n]": @"[^\r\n]",
				StandardCharacterCategories.SpaceOrTab => positiveScope ? @"[\t ]": @"[^\t ]",

                StandardCharacterCategories.WordCharacter => positiveScope ? @"\w": @"\W",
                StandardCharacterCategories.WhiteSpace => positiveScope ? @"\s":  @"\S",

                StandardCharacterCategories.WordCharacterOrWhiteSpace => positiveScope ? @"[\w\s]" : @"[^\w\s]",

                _ => null,
            };

            if (simple != null)
            {
                return simple;
            }

            var regex = positiveScope ? "[" : "[^";

            var wordCharacterFlags = pattern.EvaluateContainsFlags(StandardCharacterCategories.WordCharacter);

            if (wordCharacterFlags != FlagCheckResult.None)
            {
                if (wordCharacterFlags == FlagCheckResult.All)
                {
                    regex += @"\w";
                }
                else
                {
                    if (pattern.HasFlag(StandardCharacterCategories.UpperLetter))
                    {
                        regex += "A-Z";
                    }

                    if (pattern.HasFlag(StandardCharacterCategories.LowerLetter))
                    {
                        regex += "a-z";
                    }

                    if (pattern.HasFlag(StandardCharacterCategories.Underscore))
                    {
                        regex += "_";
                    }

                    if (pattern.HasFlag(StandardCharacterCategories.Digit))
                    {
                        regex += "0-9";
                    }
                }
            }


            var whiteSpaceFlags = pattern.EvaluateContainsFlags(StandardCharacterCategories.WhiteSpace);

            if (whiteSpaceFlags != FlagCheckResult.None)
            {
                if (whiteSpaceFlags == FlagCheckResult.All)
                {
                    regex += @"\s";
                }
                else
                {
                    if (pattern.HasFlag(StandardCharacterCategories.Tab))
                    {
                        regex += @"\t";
                    }

                    if (pattern.HasFlag(StandardCharacterCategories.Space))
                    {
                        regex += @" ";
                    }

                    if (pattern.HasFlag(StandardCharacterCategories.NewLine))
                    {
                        regex += @"\n";
                    }

                    if (pattern.HasFlag(StandardCharacterCategories.Return))
                    {
                        regex += @"\r";
                    }
                }
            }

            regex += "]";

			return regex;
        }
示例#10
0
        public static IEnumerable<char> Matches(this StandardCharacterCategories pattern, IEnumerable<char> characters)
        {
            var positive = pattern.GetValidPatternType() == StandardCharactersPatternType.Positive;

            return characters.Where(character => IsCharacterFromPatternInternal(character, pattern, positive));
        }
 /// <inheritdoc />
 public string CreateCharRange(IRegularExpressionFactoryContext ctx, StandardCharacterCategories range)
 {
     return(range.ToRegexStatement());
 }
示例#12
0
 public static bool IsEmpty(this StandardCharacterCategories pattern)
 {
     return pattern == StandardCharacterCategories.None;
 }
示例#13
0
 public static bool IsValid(this StandardCharacterCategories pattern)
 {
     var type = pattern.GetPatternType();
     return type != StandardCharactersPatternType.Invalid;
 }
示例#14
0
		public static bool IsAny(this char character, StandardCharacterCategories pattern)
        {
            var matches = IsCharacterFromPatternInternal(character, pattern, pattern.GetValidPatternType() == StandardCharactersPatternType.Positive);
           
            return matches;
        }
示例#15
0
 public static bool HasAny(this StandardCharacterCategories pattern, StandardCharacterCategories contained)
 {
     return (pattern & contained) != StandardCharacterCategories.None;
 }
示例#16
0
 public static bool HasAll(this StandardCharacterCategories pattern, StandardCharacterCategories contained)
 {
     return (pattern & contained) == contained;
 }
示例#17
0
 public static bool IsDefined(this StandardCharacterCategories pattern)
 {
     return pattern != StandardCharacterCategories.None;
 }
示例#18
0
 public static IDefineCharactersRange ToDefinition(this StandardCharacterCategories pattern)
 {
     return CharactersRangeDefinition.CreateMatching(pattern);
 }
示例#19
0
 /// <inheritdoc />
 public StandardCharacterRangeBrick(IFlexpressionAlgebra algebra, StandardCharacterCategories letterTypes) : base(algebra)
 {
     _range = letterTypes;
 }
示例#20
0
 public static string Description(this StandardCharacterCategories pattern)
 {
     return $"{pattern}";
 }
 public StandardCategory(StandardCharacterCategories category)
 {
     _category = category;
 }
示例#22
0
 public static bool IsMatchAny(this StandardCharacterCategories pattern, IEnumerable<char> characters)
 {
     return IsAnyCharacterFromPattern(characters, pattern);
 }