19 writes to Str
System.Text.RegularExpressions (19)
System\Text\RegularExpressions\RegexNode.cs (19)
68
Str
= str;
190
Str
= null;
198
Str
= new string(Ch, N);
1011
Str
= null;
1016
Str
= null;
1026
Str
= null;
1044
Str
= RegexCharClass.AnyClass;
1049
Str
= RegexCharClass.NotDigitClass;
1052
Str
= RegexCharClass.NotSpaceClass;
1055
Str
= RegexCharClass.NotWordClass;
1203
prev.
Str
= prevCharClass.ToStringClass();
1496
node.
Str
= null;
1502
node.
Str
= null;
1506
node.
Str
= node.Str.Substring(startingSpan.Length);
1826
prev.
Str
= prev.Ch.ToString();
1829
prev.
Str
= (optionsAt & RegexOptions.RightToLeft) == 0 ?
1972
nextNode.
Str
= null;
1976
nextNode.
Str
= nextNode.Str.Substring(matchingCharsInMulti);
3289
Str
= new string(Ch, max);
157 references to Str
System.Text.RegularExpressions (157)
System\Text\RegularExpressions\RegexCompiler.cs (24)
1364
EmitMatchCharacterClass(target.LoopNode.
Str
!);
1473
int length = node.Kind == RegexNodeKind.Multi ? node.
Str
!.Length : 1;
1952
int numChars = RegexCharClass.GetSetChars(startingLiteralNode.
Str
!, setChars);
2096
return multi.
Str
!.Length == 2 ?
2097
new(RegexNodeKind.One, multi.Options, multi.
Str
[1]) :
2098
new(RegexNodeKind.Multi, multi.Options, multi.
Str
.Substring(1));
3253
EmitMatchCharacterClass(node.
Str
);
3485
EmitMultiCharString(node.
Str
!, emitLengthCheck, (node.Options & RegexOptions.RightToLeft) != 0);
3686
Ldc(literal.
Str
![0]);
3691
EmitMatchCharacterClass(literal.
Str
!);
4054
node.
Str
== RegexCharClass.AnyClass &&
4582
if (node.IsSetFamily && node.
Str
== RegexCharClass.AnyClass)
4724
EmitMatchCharacterClass(node.
Str
);
4759
else if (node.IsSetFamily && maxIterations == int.MaxValue && node.
Str
== RegexCharClass.AnyClass)
4839
EmitMatchCharacterClass(node.
Str
);
4961
EmitMatchCharacterClass(node.
Str
);
5443
literalLength = node.
Str
!.Length;
5456
if (RegexCharClass.TryGetSingleRange(node.
Str
, out _, out _) ||
5457
RegexCharClass.GetSetChars(node.
Str
, setChars) > 0)
5478
Ldstr(node.
Str
!);
5506
bool negated = RegexCharClass.IsNegated(node.
Str
) ^ negate;
5510
if (RegexCharClass.TryGetSingleRange(node.
Str
, out char lowInclusive, out char highInclusive) &&
5527
int setCharsCount = RegexCharClass.GetSetChars(node.
Str
, setChars);
5685
Ldc((root.Kind == RegexNodeKind.Multi ? root.
Str
!.Length : 1) * (!rtl ? 1 : -1));
System\Text\RegularExpressions\RegexFindOptimizations.cs (1)
841
while ((uint)--prev < (uint)slice.Length && RegexCharClass.CharInClass(slice[prev], loopNode.
Str
!, ref _asciiLookups![0])) ;
System\Text\RegularExpressions\RegexNode.cs (100)
95
new RegexNode(Kind, Options,
Str
!) :
332
Debug.Assert(node.
Str
is not null, "Expect non-null multi string");
333
Debug.Assert(node.
Str
.Length >= 2, $"Expected {node.
Str
} to be at least two characters");
340
Debug.Assert(!string.IsNullOrEmpty(node.
Str
), $"Expected non-null, non-empty string for {node.Kind}.");
344
Debug.Assert(node.
Str
is null, $"Expected null string for {node.Kind}, got \"{node.
Str
}\".");
1006
Debug.Assert(!string.IsNullOrEmpty(
Str
));
1008
if (RegexCharClass.IsEmpty(
Str
))
1013
else if (RegexCharClass.IsSingleton(
Str
))
1015
Ch = RegexCharClass.SingletonChar(
Str
);
1023
else if (RegexCharClass.IsSingletonInverse(
Str
))
1025
Ch = RegexCharClass.SingletonChar(
Str
);
1035
switch (
Str
)
1160
if (!wasLastSet || optionsLast != optionsAt || lastNodeCannotMerge || !RegexCharClass.IsMergeable(at.
Str
!))
1163
lastNodeCannotMerge = !RegexCharClass.IsMergeable(at.
Str
!);
1189
prevCharClass = RegexCharClass.Parse(prev.
Str
!);
1198
RegexCharClass atCharClass = RegexCharClass.Parse(at.
Str
!);
1279
required.
Str
!= other.
Str
)
1402
scoped ReadOnlySpan<char> startingSpan = startingNode.
Str
.AsSpan();
1438
Debug.Assert(startingNode.
Str
!.Length > 0);
1440
int minLength = Math.Min(startingSpan.Length, startingNode.
Str
.Length);
1442
while (c < minLength && startingSpan[c] == startingNode.
Str
[c]) c++;
1492
Debug.Assert(node.
Str
.AsSpan().StartsWith(startingSpan, StringComparison.Ordinal));
1493
if (node.
Str
!.Length == startingSpan.Length)
1498
else if (node.
Str
.Length - 1 == startingSpan.Length)
1501
node.Ch = node.
Str
[node.
Str
.Length - 1];
1506
node.Str = node.
Str
.Substring(startingSpan.Length);
1548
return IsOneFamily ? Ch :
Str
![0];
1599
if (RegexCharClass.IsNegated(startingLiteralNode.
Str
!) ||
1600
(numChars = RegexCharClass.GetSetChars(startingLiteralNode.
Str
!, setChars)) == 0)
1673
if (RegexCharClass.TryGetSingleRange(node.
Str
!, out char lowInclusive, out char highInclusive) &&
1677
return new StartingLiteralData(range: (lowInclusive, highInclusive), negated: RegexCharClass.IsNegated(node.
Str
!));
1682
if ((numChars = RegexCharClass.GetSetChars(node.
Str
!, setChars)) != 0)
1684
return new StartingLiteralData(setChars: setChars.Slice(0, numChars).ToString(), negated: RegexCharClass.IsNegated(node.
Str
!));
1689
return new StartingLiteralData(@string: node.
Str
);
1830
((at.Kind == RegexNodeKind.One) ? $"{prev.
Str
}{at.Ch}" : prev.
Str
+ at.
Str
) :
1831
((at.Kind == RegexNodeKind.One) ? $"{at.Ch}{prev.
Str
}" : at.
Str
+ prev.
Str
);
1895
case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when nextNode.Kind == currentNode.Kind && currentNode.
Str
== nextNode.
Str
:
1922
case RegexNodeKind.Setloop or RegexNodeKind.Setlazy when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
1939
currentNode.Ch == nextNode.
Str
![0]:
1944
while (matchingCharsInMulti < nextNode.
Str
.Length && currentNode.Ch == nextNode.
Str
[matchingCharsInMulti])
1959
if (nextNode.
Str
.Length == matchingCharsInMulti)
1967
Debug.Assert(matchingCharsInMulti < nextNode.
Str
.Length);
1968
if (nextNode.
Str
.Length - matchingCharsInMulti == 1)
1971
nextNode.Ch = nextNode.
Str
[nextNode.
Str
.Length - 1];
1976
nextNode.Str = nextNode.
Str
.Substring(matchingCharsInMulti);
1990
case RegexNodeKind.Set when (nextNode.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy) && currentNode.
Str
== nextNode.
Str
:
2004
case RegexNodeKind.Set when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
2403
case RegexNodeKind.Set when loopNode.Kind is RegexNodeKind.Setloop && RegexCharClass.IsSubsetOf(literal.
Str
!, loopNode.
Str
!): // e.g. \d+[0-9]\s
2411
case RegexNodeKind.Multi when CharInLoopSet(loopNode, literal.
Str
![0]) && !CharInLoopSet(loopNode, literal.
Str
[1]):
2425
RegexNodeKind.Setloop => RegexCharClass.CharInClass(ch, loopNode.
Str
!),
2525
case RegexNodeKind.Set when !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2528
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2529
case RegexNodeKind.Multi when node.Ch != subsequent.
Str
![0]:
2540
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2555
case RegexNodeKind.Multi when node.Ch == subsequent.
Str
![0]:
2572
case RegexNodeKind.One when !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2573
case RegexNodeKind.Set when !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2574
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2575
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2576
case RegexNodeKind.Multi when !RegexCharClass.CharInClass(subsequent.
Str
![0], node.
Str
!):
2578
case RegexNodeKind.EndZ or RegexNodeKind.Eol when !RegexCharClass.CharInClass('\n', node.
Str
!):
2579
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsSubsetOf(node.
Str
!, RegexCharClass.WordClass):
2580
case RegexNodeKind.NonBoundary when node.M > 0 && node.
Str
is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass:
2581
case RegexNodeKind.ECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass:
2582
case RegexNodeKind.NonECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass:
2585
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2586
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2620
case RegexNodeKind.Set when !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2622
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2623
case RegexNodeKind.Multi when !CharInStartingOrEndingSet(subsequent.
Str
![0]):
2633
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2836
return
Str
!.Length;
2949
return
Str
!.Length;
3135
if (!Ascii.IsValid(child.
Str
) ||
3136
RegexCharClass.ParticipatesInCaseConversion(child.
Str
.AsSpan()))
3141
vsb.Append(child.
Str
);
3148
if (!RegexCharClass.SetContainsAsciiOrdinalIgnoreCaseCharacter(child.
Str
!, twoChars))
3434
[MemberNotNullWhen(true, nameof(
Str
))]
3515
foreach (char c in
Str
!)
3525
sb.Append(' ').Append(RegexCharClass.DescribeSet(
Str
!));
System\Text\RegularExpressions\RegexNodeKind.cs (5)
22
/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.
Str
"/>.</remarks>
26
/// <remarks>The characters are specified in <see cref="RegexNode.
Str
"/>. This is purely a representational optimization, equivalent to multiple <see cref="One"/> nodes concatenated together.</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"/>.
System\Text\RegularExpressions\RegexPrefixAnalyzer.cs (20)
129
sb.Append(node.
Str
);
136
foreach (char c in node.
Str
!)
156
case RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic when !RegexCharClass.IsNegated(node.
Str
!): // negated sets are too complex to analyze
158
int charCount = RegexCharClass.GetSetChars(node.
Str
!, setChars);
197
if (!RegexCharClass.SetContainsAsciiOrdinalIgnoreCaseCharacter(node.
Str
!, setChars))
428
vsb.Append(node.
Str
);
623
string s = node.
Str
!;
636
results.Add(new RegexFindOptimizations.FixedDistanceSet(null, node.
Str
!, distance++));
647
results.Add(new RegexFindOptimizations.FixedDistanceSet(null, node.
Str
!, distance++));
986
cc = RegexCharClass.Parse(node.
Str
!);
989
else if (cc.CanMerge && RegexCharClass.Parse(node.
Str
!) is { CanMerge: true } setCc)
1005
cc.AddChar(node.
Str
![firstChar ? 0 : node.
Str
.Length - 1]);
1184
RegexCharClass.CharInClass(prefix[0], firstChild.
Str
!) ? null :
1205
if (RegexCharClass.CharInClass((char)(ordinalCaseInsensitivePrefix[0] | 0x20), firstChild.
Str
!) ||
1206
RegexCharClass.CharInClass((char)(ordinalCaseInsensitivePrefix[0] & ~0x20), firstChild.
Str
!))
1211
else if (RegexCharClass.CharInClass(ordinalCaseInsensitivePrefix[0], firstChild.
Str
!))
1232
!RegexCharClass.IsNegated(nextChild.
Str
!) &&
1236
chars = chars.Slice(0, RegexCharClass.GetSetChars(nextChild.
Str
!, chars));
1241
if (RegexCharClass.CharInClass(c, firstChild.
Str
!))
System\Text\RegularExpressions\RegexReplacement.cs (1)
51
vsb.Append(child.
Str
!);
System\Text\RegularExpressions\RegexWriter.cs (3)
407
int stringCode = StringCode(node.
Str
!);
420
Emit((RegexOpcode)node.Kind | bits, StringCode(node.
Str
!));
424
Emit((RegexOpcode)node.Kind | bits, StringCode(node.
Str
!));
System\Text\RegularExpressions\Symbolic\RegexNodeConverter.cs (3)
72
string? str = node.
Str
;
125
string? set = node.
Str
;
314
string? set = node.
Str
;