7 instantiations of RegexCharClass
System.Text.RegularExpressions.Generator (7)
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexCharClass.cs (1)
1506return new RegexCharClass(IsNegated(charClass, start), ranges, categoriesBuilder, sub);
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexNode.cs (1)
1028prevCharClass = new RegexCharClass();
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexParser.cs (2)
555RegexCharClass? charClass = scanOnly ? null : new RegexCharClass(); 1131var cc = new RegexCharClass();
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexPrefixAnalyzer.cs (3)
948cc ??= new RegexCharClass(); 957cc ??= new RegexCharClass(); 994cc ??= new RegexCharClass();
255 references to RegexCharClass
System.Text.RegularExpressions.Generator (255)
RegexGenerator.Emitter.cs (124)
405return chars.Length > 5 || RegexCharClass.IsAscii(chars) 417if (RegexCharClass.IsAscii(chars)) 516if (!RegexCharClass.CharInClass((char)i, set)) 525RegexCharClass.DigitClass => "IndexOfAnyDigit", 526RegexCharClass.ControlClass => "IndexOfAnyControl", 527RegexCharClass.LetterClass => "IndexOfAnyLetter", 528RegexCharClass.LetterOrDigitClass => "IndexOfAnyLetterOrDigit", 529RegexCharClass.LowerClass => "IndexOfAnyLower", 530RegexCharClass.NumberClass => "IndexOfAnyNumber", 531RegexCharClass.PunctuationClass => "IndexOfAnyPunctuation", 532RegexCharClass.SeparatorClass => "IndexOfAnySeparator", 533RegexCharClass.SpaceClass => "IndexOfAnyWhiteSpace", 534RegexCharClass.SymbolClass => "IndexOfAnySymbol", 535RegexCharClass.UpperClass => "IndexOfAnyUpper", 536RegexCharClass.WordClass => "IndexOfAnyWordChar", 538RegexCharClass.NotDigitClass => "IndexOfAnyExceptDigit", 539RegexCharClass.NotControlClass => "IndexOfAnyExceptControl", 540RegexCharClass.NotLetterClass => "IndexOfAnyExceptLetter", 541RegexCharClass.NotLetterOrDigitClass => "IndexOfAnyExceptLetterOrDigit", 542RegexCharClass.NotLowerClass => "IndexOfAnyExceptLower", 543RegexCharClass.NotNumberClass => "IndexOfAnyExceptNumber", 544RegexCharClass.NotPunctuationClass => "IndexOfAnyExceptPunctuation", 545RegexCharClass.NotSeparatorClass => "IndexOfAnyExceptSeparator", 546RegexCharClass.NotSpaceClass => "IndexOfAnyExceptWhiteSpace", 547RegexCharClass.NotSymbolClass => "IndexOfAnyExceptSymbol", 548RegexCharClass.NotUpperClass => "IndexOfAnyExceptUpper", 549RegexCharClass.NotWordClass => "IndexOfAnyExceptWordChar", 558if (RegexCharClass.TryGetOnlyCategories(set, categories, out int numCategories, out bool negatedCategory)) 1157primarySet.Set != RegexCharClass.NotNewLineClass && 1158primarySet.Set != RegexCharClass.AnyClass; 1223else if (RegexCharClass.IsUnicodeCategoryOfSmallCharCount(primarySet.Set, out char[]? setChars, out bool negated, out string? description)) 1741if (RegexCharClass.IsNegated(startingLiteralNode.Str!) || 1742(numChars = RegexCharClass.GetSetChars(startingLiteralNode.Str!, setChars)) == 0) 1809int numChars = RegexCharClass.GetSetChars(startingLiteralNode.Str!, setChars); 3625node.Str == RegexCharClass.AnyClass && 4044else if (node.IsSetFamily && node.Str == RegexCharClass.AnyClass) 4153if (node.IsSetFamily && maxIterations == int.MaxValue && node.Str == RegexCharClass.AnyClass) 4176else if (node.IsSetFamily && maxIterations == int.MaxValue && node.Str == RegexCharClass.AnyClass) 4963bool negated = RegexCharClass.IsNegated(node.Str) ^ negate; 4967if (RegexCharClass.TryGetSingleRange(node.Str, out char lowInclusive, out char highInclusive) && 4982setChars = setChars.Slice(0, RegexCharClass.GetSetChars(node.Str, setChars)); 5021case RegexCharClass.AnyClass: 5024case RegexCharClass.DigitClass: 5025case RegexCharClass.NotDigitClass: 5026negate ^= charClass == RegexCharClass.NotDigitClass; 5029case RegexCharClass.SpaceClass: 5030case RegexCharClass.NotSpaceClass: 5031negate ^= charClass == RegexCharClass.NotSpaceClass; 5034case RegexCharClass.WordClass: 5035case RegexCharClass.NotWordClass: 5037negate ^= charClass == RegexCharClass.NotWordClass; 5040case RegexCharClass.ControlClass: 5041case RegexCharClass.NotControlClass: 5042negate ^= charClass == RegexCharClass.NotControlClass; 5045case RegexCharClass.LetterClass: 5046case RegexCharClass.NotLetterClass: 5047negate ^= charClass == RegexCharClass.NotLetterClass; 5050case RegexCharClass.LetterOrDigitClass: 5051case RegexCharClass.NotLetterOrDigitClass: 5052negate ^= charClass == RegexCharClass.NotLetterOrDigitClass; 5055case RegexCharClass.LowerClass: 5056case RegexCharClass.NotLowerClass: 5057negate ^= charClass == RegexCharClass.NotLowerClass; 5060case RegexCharClass.UpperClass: 5061case RegexCharClass.NotUpperClass: 5062negate ^= charClass == RegexCharClass.NotUpperClass; 5065case RegexCharClass.NumberClass: 5066case RegexCharClass.NotNumberClass: 5067negate ^= charClass == RegexCharClass.NotNumberClass; 5070case RegexCharClass.PunctuationClass: 5071case RegexCharClass.NotPunctuationClass: 5072negate ^= charClass == RegexCharClass.NotPunctuationClass; 5075case RegexCharClass.SeparatorClass: 5076case RegexCharClass.NotSeparatorClass: 5077negate ^= charClass == RegexCharClass.NotSeparatorClass; 5080case RegexCharClass.SymbolClass: 5081case RegexCharClass.NotSymbolClass: 5082negate ^= charClass == RegexCharClass.NotSymbolClass; 5085case RegexCharClass.AsciiLetterClass: 5086case RegexCharClass.NotAsciiLetterClass: 5087negate ^= charClass == RegexCharClass.NotAsciiLetterClass; 5090case RegexCharClass.AsciiLetterOrDigitClass: 5091case RegexCharClass.NotAsciiLetterOrDigitClass: 5092negate ^= charClass == RegexCharClass.NotAsciiLetterOrDigitClass; 5095case RegexCharClass.HexDigitClass: 5096case RegexCharClass.NotHexDigitClass: 5097negate ^= charClass == RegexCharClass.NotHexDigitClass; 5100case RegexCharClass.HexDigitLowerClass: 5101case RegexCharClass.NotHexDigitLowerClass: 5102negate ^= charClass == RegexCharClass.NotHexDigitLowerClass; 5105case RegexCharClass.HexDigitUpperClass: 5106case RegexCharClass.NotHexDigitUpperClass: 5107negate ^= charClass == RegexCharClass.NotHexDigitUpperClass; 5112if (RegexCharClass.TryGetSingleRange(charClass, out char lowInclusive, out char highInclusive)) 5114negate ^= RegexCharClass.IsNegated(charClass); 5134if (RegexCharClass.TryGetOnlyCategories(charClass, categories, out int numCategories, out bool negated)) 5154switch (RegexCharClass.GetSetChars(charClass, setChars)) 5157negate ^= RegexCharClass.IsNegated(charClass); 5158if (RegexCharClass.DifferByOneBit(setChars[0], setChars[1], out mask)) 5168negate ^= RegexCharClass.IsNegated(charClass); 5170return (negate, RegexCharClass.DifferByOneBit(setChars[0], setChars[1], out mask)) switch 5181if (RegexCharClass.TryGetDoubleRange(charClass, out (char LowInclusive, char HighInclusive) rangeLower, out (char LowInclusive, char HighInclusive) rangeUpper) && 5188negate ^= RegexCharClass.IsNegated(charClass); 5193RegexCharClass.CharClassAnalysisResults analysis = RegexCharClass.Analyze(charClass); 5205bool negatedClass = RegexCharClass.IsNegated(charClass); 5209if (RegexCharClass.CharInClass((char)i, charClass) ^ negatedClass) 5240bool negatedClass = RegexCharClass.IsNegated(charClass); 5244if (RegexCharClass.CharInClass((char)i, charClass) ^ negatedClass) 5264if (RegexCharClass.TryGetDoubleRange(charClass, out (char LowInclusive, char HighInclusive) range0, out (char LowInclusive, char HighInclusive) range1)) 5266negate ^= RegexCharClass.IsNegated(charClass); 5319if (RegexCharClass.CharInClass(c, charClass)) 5531RegexCharClass.AnyClass => "any character", 5532RegexCharClass.DigitClass => "a Unicode digit", 5533RegexCharClass.ECMASpaceClass => "a whitespace character (ECMA)", 5534RegexCharClass.ECMAWordClass => "a word character (ECMA)", 5535RegexCharClass.NotDigitClass => "any character other than a Unicode digit", 5536RegexCharClass.NotECMASpaceClass => "any character other than a whitespace character (ECMA)", 5537RegexCharClass.NotECMAWordClass => "any character other than a word character (ECMA)", 5538RegexCharClass.NotSpaceClass => "any character other than a whitespace character", 5539RegexCharClass.NotWordClass => "any character other than a word character", 5540RegexCharClass.SpaceClass => "a whitespace character", 5541RegexCharClass.WordClass => "a word character", 5542_ => $"a character in the set {RegexCharClass.DescribeSet(charClass)}",
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexCharClass.cs (8)
316private RegexCharClass? _subtractor; 349private RegexCharClass(bool negate, List<(char First, char Last)>? ranges, StringBuilder? categories, RegexCharClass? subtraction) 369public void AddCharClass(RegexCharClass cc) 387public bool TryAddCharClass(RegexCharClass cc) 425public void AddSubtraction(RegexCharClass sub) 1481public static RegexCharClass Parse(string charClass) => ParseRecursive(charClass, 0); 1483private static RegexCharClass ParseRecursive(string charClass, int start) 1494RegexCharClass? sub = null;
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexFindOptimizations.cs (4)
131if (!RegexCharClass.IsNegated(charClass) && 132(scratchCount = RegexCharClass.GetSetChars(charClass, scratch)) > 0) 142Debug.Assert(!RegexCharClass.IsNegated(charClass)); 149Debug.Assert(!RegexCharClass.IsNegated(charClass) || chars is null);
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexNode.cs (54)
26/// <remarks>For a <see cref="RegexNodeKind.Multi"/>, this is the string from the expression. For an <see cref="IsSetFamily"/> node, this is the character class string from <see cref="RegexCharClass"/>.</remarks> 126string stringSet = RegexCharClass.CharsToStringClass(equivalences); 879if (RegexCharClass.IsEmpty(Str)) 884else if (RegexCharClass.IsSingleton(Str)) 886Ch = RegexCharClass.SingletonChar(Str); 894else if (RegexCharClass.IsSingletonInverse(Str)) 896Ch = RegexCharClass.SingletonChar(Str); 909case RegexCharClass.WordNotWordClass: 910case RegexCharClass.NotWordWordClass: 911case RegexCharClass.DigitNotDigitClass: 912case RegexCharClass.NotDigitDigitClass: 913case RegexCharClass.SpaceNotSpaceClass: 914case RegexCharClass.NotSpaceSpaceClass: 915Str = RegexCharClass.AnyClass; 1004if (!wasLastSet || optionsLast != optionsAt || lastNodeCannotMerge || !RegexCharClass.IsMergeable(at.Str!)) 1007lastNodeCannotMerge = !RegexCharClass.IsMergeable(at.Str!); 1025RegexCharClass prevCharClass; 1033prevCharClass = RegexCharClass.Parse(prev.Str!); 1042RegexCharClass atCharClass = RegexCharClass.Parse(at.Str!); 1446if (RegexCharClass.TryGetSingleRange(node.Str!, out char lowInclusive, out char highInclusive) && 1450return new StartingLiteralData(range: (lowInclusive, highInclusive), negated: RegexCharClass.IsNegated(node.Str!)); 1455if ((numChars = RegexCharClass.GetSetChars(node.Str!, setChars)) != 0) 1457return new StartingLiteralData(setChars: setChars.Slice(0, numChars).ToString(), negated: RegexCharClass.IsNegated(node.Str!)); 2126case RegexNodeKind.Set when !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2129case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2137case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2138case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsBoundaryWordChar(node.Ch): 2139case RegexNodeKind.NonBoundary when node.M > 0 && !RegexCharClass.IsBoundaryWordChar(node.Ch): 2140case RegexNodeKind.ECMABoundary when node.M > 0 && RegexCharClass.IsECMAWordChar(node.Ch): 2141case RegexNodeKind.NonECMABoundary when node.M > 0 && !RegexCharClass.IsECMAWordChar(node.Ch): 2173case RegexNodeKind.One when !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2174case RegexNodeKind.Set when !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2175case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2176case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2177case RegexNodeKind.Multi when !RegexCharClass.CharInClass(subsequent.Str![0], node.Str!): 2179case RegexNodeKind.EndZ or RegexNodeKind.Eol when !RegexCharClass.CharInClass('\n', node.Str!): 2182case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2183case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2184case RegexNodeKind.Boundary when node.M > 0 && node.Str is RegexCharClass.WordClass or RegexCharClass.DigitClass: 2185case RegexNodeKind.NonBoundary when node.M > 0 && node.Str is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass: 2186case RegexNodeKind.ECMABoundary when node.M > 0 && node.Str is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass: 2187case RegexNodeKind.NonECMABoundary when node.M > 0 && node.Str is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass: 2539RegexCharClass.ParticipatesInCaseConversion(child.Ch)) 2550if (!RegexCharClass.IsAscii(child.Str.AsSpan()) || 2551RegexCharClass.ParticipatesInCaseConversion(child.Str.AsSpan())) 2563if (!RegexCharClass.SetContainsAsciiOrdinalIgnoreCaseCharacter(child.Str!, twoChars)) 2902sb.Append(" '").Append(RegexCharClass.DescribeChar(Ch)).Append('\''); 2919sb.Append(RegexCharClass.DescribeChar(c)); 2927sb.Append(' ').Append(RegexCharClass.DescribeSet(Str!));
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexNodeKind.cs (4)
22/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.Str"/>.</remarks> 40/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.Str"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.</remarks> 53/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.Str"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.</remarks> 71/// The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.Str"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexParser.cs (27)
403new RegexNode(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, RegexCharClass.AnyClass) : 547private RegexCharClass? ScanCharClass(bool caseInsensitive, bool scanOnly) 555RegexCharClass? charClass = scanOnly ? null : new RegexCharClass(); 710RegexCharClass? rcc = ScanCharClass(caseInsensitive, scanOnly); 865else if (RegexCharClass.IsBoundaryWordChar(ch)) 912else if (RegexCharClass.IsBoundaryWordChar(ch)) 967else if (RegexCharClass.IsBoundaryWordChar(ch)) 1096new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMAWordClass : RegexCharClass.WordClass); 1101new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMAWordClass : RegexCharClass.NotWordClass); 1106new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMASpaceClass : RegexCharClass.SpaceClass); 1111new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMASpaceClass : RegexCharClass.NotSpaceClass); 1116new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMADigitClass : RegexCharClass.DigitClass); 1121new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMADigitClass : RegexCharClass.NotDigitClass); 1131var cc = new RegexCharClass(); 1261else if (angled && RegexCharClass.IsBoundaryWordChar(ch)) 1360else if (angled && RegexCharClass.IsBoundaryWordChar(ch)) 1422if (!RegexCharClass.IsBoundaryWordChar(_pattern[_pos++])) 1609if ((_options & RegexOptions.ECMAScript) == 0 && RegexCharClass.IsBoundaryWordChar(ch)) 1635if (!(RegexCharClass.IsBoundaryWordChar(ch) || ch == '-')) 1728if (ch != '0' && RegexCharClass.IsBoundaryWordChar(ch)) 2021case > 1 when (_options & RegexOptions.IgnoreCase) == 0 || isReplacement || !RegexCharClass.ParticipatesInCaseConversion(_pattern.AsSpan(pos, cch)):
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexPrefixAnalyzer.cs (34)
112case RegexNodeKind.One or RegexNodeKind.Oneloop or RegexNodeKind.Onelazy or RegexNodeKind.Oneloopatomic when !ignoreCase || !RegexCharClass.ParticipatesInCaseConversion(node.Ch): 138if (RegexCharClass.ParticipatesInCaseConversion(c)) 156case RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic when !RegexCharClass.IsNegated(node.Str!): // negated sets are too complex to analyze 158int charCount = RegexCharClass.GetSetChars(node.Str!, setChars); 197if (!RegexCharClass.SetContainsAsciiOrdinalIgnoreCaseCharacter(node.Str!, setChars)) 530if (results[i].Set == RegexCharClass.AnyClass) 532results.RemoveAll(s => s.Set == RegexCharClass.AnyClass); 543charClass == RegexCharClass.AnyClass) // weed out match-all, same as above 557result.Negated = RegexCharClass.IsNegated(result.Set); 559if (RegexCharClass.TryGetSingleRange(result.Set, out char lowInclusive, out char highInclusive) && 566int count = RegexCharClass.GetSetChars(result.Set, scratch); 603string setString = RegexCharClass.OneToStringClass(node.Ch); 611string setString = RegexCharClass.OneToStringClass(node.Ch); 627string setString = RegexCharClass.OneToStringClass(s[i]); 714var combined = new Dictionary<int, (RegexCharClass Set, int Count)>(); 742if (combined.TryGetValue(fixedSet.Distance, out (RegexCharClass Set, int Count) value)) 744if (value.Set.TryAddCharClass(RegexCharClass.Parse(fixedSet.Set))) 752combined[fixedSet.Distance] = (RegexCharClass.Parse(fixedSet.Set), 1); 757foreach (KeyValuePair<int, (RegexCharClass Set, int Count)> pair in combined) 829if (!RegexCharClass.IsAscii(s1Chars) && !RegexCharClass.IsAscii(s2Chars)) 915RegexCharClass? cc = null; 933static bool? TryFindFirstCharClass(RegexNode node, ref RegexCharClass? cc) 977cc = RegexCharClass.Parse(node.Str!); 980else if (cc.CanMerge && RegexCharClass.Parse(node.Str!) is { CanMerge: true } setCc) 1160RegexCharClass.CharInClass(prefix[0], firstChild.Str!) ? null : 1176!RegexCharClass.ParticipatesInCaseConversion(ordinalCaseInsensitivePrefix[0]) || 1179if (RegexCharClass.ParticipatesInCaseConversion(ordinalCaseInsensitivePrefix[0])) 1181if (RegexCharClass.CharInClass((char)(ordinalCaseInsensitivePrefix[0] | 0x20), firstChild.Str!) || 1182RegexCharClass.CharInClass((char)(ordinalCaseInsensitivePrefix[0] & ~0x20), firstChild.Str!)) 1187else if (RegexCharClass.CharInClass(ordinalCaseInsensitivePrefix[0], firstChild.Str!)) 1208!RegexCharClass.IsNegated(nextChild.Str!) && 1212chars = chars.Slice(0, RegexCharClass.GetSetChars(nextChild.Str!, chars)); 1217if (RegexCharClass.CharInClass(c, firstChild.Str!))