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);
964
Str
= null;
969
Str
= null;
979
Str
= null;
997
Str
= RegexCharClass.AnyClass;
1002
Str
= RegexCharClass.NotDigitClass;
1005
Str
= RegexCharClass.NotSpaceClass;
1008
Str
= RegexCharClass.NotWordClass;
1156
prev.
Str
= prevCharClass.ToStringClass();
1448
node.
Str
= null;
1454
node.
Str
= null;
1458
node.
Str
= node.Str.Substring(startingSpan.Length);
1708
prev.
Str
= prev.Ch.ToString();
1711
prev.
Str
= (optionsAt & RegexOptions.RightToLeft) == 0 ?
1854
nextNode.
Str
= null;
1858
nextNode.
Str
= nextNode.Str.Substring(matchingCharsInMulti);
3001
Str
= new string(Ch, max);
144 references to Str
System.Text.RegularExpressions (144)
System\Text\RegularExpressions\RegexCompiler.cs (18)
1358
EmitMatchCharacterClass(target.LoopNode.
Str
!);
1467
int length = node.Kind == RegexNodeKind.Multi ? node.
Str
!.Length : 1;
3005
EmitMatchCharacterClass(node.
Str
);
3237
EmitMultiCharString(node.
Str
!, emitLengthCheck, (node.Options & RegexOptions.RightToLeft) != 0);
3747
node.
Str
== RegexCharClass.AnyClass &&
4275
if (node.IsSetFamily && node.
Str
== RegexCharClass.AnyClass)
4417
EmitMatchCharacterClass(node.
Str
);
4452
else if (node.IsSetFamily && maxIterations == int.MaxValue && node.
Str
== RegexCharClass.AnyClass)
4532
EmitMatchCharacterClass(node.
Str
);
4654
EmitMatchCharacterClass(node.
Str
);
5136
literalLength = node.
Str
!.Length;
5149
if (RegexCharClass.TryGetSingleRange(node.
Str
, out _, out _) ||
5150
RegexCharClass.GetSetChars(node.
Str
, setChars) > 0)
5171
Ldstr(node.
Str
!);
5199
bool negated = RegexCharClass.IsNegated(node.
Str
) ^ negate;
5203
if (RegexCharClass.TryGetSingleRange(node.
Str
, out char lowInclusive, out char highInclusive) &&
5220
int setCharsCount = RegexCharClass.GetSetChars(node.
Str
, setChars);
5378
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 (93)
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
}\".");
959
Debug.Assert(!string.IsNullOrEmpty(
Str
));
961
if (RegexCharClass.IsEmpty(
Str
))
966
else if (RegexCharClass.IsSingleton(
Str
))
968
Ch = RegexCharClass.SingletonChar(
Str
);
976
else if (RegexCharClass.IsSingletonInverse(
Str
))
978
Ch = RegexCharClass.SingletonChar(
Str
);
988
switch (
Str
)
1113
if (!wasLastSet || optionsLast != optionsAt || lastNodeCannotMerge || !RegexCharClass.IsMergeable(at.
Str
!))
1116
lastNodeCannotMerge = !RegexCharClass.IsMergeable(at.
Str
!);
1142
prevCharClass = RegexCharClass.Parse(prev.
Str
!);
1151
RegexCharClass atCharClass = RegexCharClass.Parse(at.
Str
!);
1239
required.
Str
!= other.
Str
)
1354
scoped ReadOnlySpan<char> startingSpan = startingNode.
Str
.AsSpan();
1390
Debug.Assert(startingNode.
Str
!.Length > 0);
1392
int minLength = Math.Min(startingSpan.Length, startingNode.
Str
.Length);
1394
while (c < minLength && startingSpan[c] == startingNode.
Str
[c]) c++;
1444
Debug.Assert(node.
Str
.AsSpan().StartsWith(startingSpan, StringComparison.Ordinal));
1445
if (node.
Str
!.Length == startingSpan.Length)
1450
else if (node.
Str
.Length - 1 == startingSpan.Length)
1453
node.Ch = node.
Str
[node.
Str
.Length - 1];
1458
node.Str = node.
Str
.Substring(startingSpan.Length);
1500
return IsOneFamily ? Ch :
Str
![0];
1555
if (RegexCharClass.TryGetSingleRange(node.
Str
!, out char lowInclusive, out char highInclusive) &&
1559
return new StartingLiteralData(range: (lowInclusive, highInclusive), negated: RegexCharClass.IsNegated(node.
Str
!));
1564
if ((numChars = RegexCharClass.GetSetChars(node.
Str
!, setChars)) != 0)
1566
return new StartingLiteralData(setChars: setChars.Slice(0, numChars).ToString(), negated: RegexCharClass.IsNegated(node.
Str
!));
1571
return new StartingLiteralData(@string: node.
Str
);
1712
((at.Kind == RegexNodeKind.One) ? $"{prev.
Str
}{at.Ch}" : prev.
Str
+ at.
Str
) :
1713
((at.Kind == RegexNodeKind.One) ? $"{at.Ch}{prev.
Str
}" : at.
Str
+ prev.
Str
);
1777
case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when nextNode.Kind == currentNode.Kind && currentNode.
Str
== nextNode.
Str
:
1804
case RegexNodeKind.Setloop or RegexNodeKind.Setlazy when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
1821
currentNode.Ch == nextNode.
Str
![0]:
1826
while (matchingCharsInMulti < nextNode.
Str
.Length && currentNode.Ch == nextNode.
Str
[matchingCharsInMulti])
1841
if (nextNode.
Str
.Length == matchingCharsInMulti)
1849
Debug.Assert(matchingCharsInMulti < nextNode.
Str
.Length);
1850
if (nextNode.
Str
.Length - matchingCharsInMulti == 1)
1853
nextNode.Ch = nextNode.
Str
[nextNode.
Str
.Length - 1];
1858
nextNode.Str = nextNode.
Str
.Substring(matchingCharsInMulti);
1872
case RegexNodeKind.Set when (nextNode.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy) && currentNode.
Str
== nextNode.
Str
:
1886
case RegexNodeKind.Set when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
2347
case RegexNodeKind.Set when !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2350
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2351
case RegexNodeKind.Multi when node.Ch != subsequent.
Str
![0]:
2362
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2377
case RegexNodeKind.Multi when node.Ch == subsequent.
Str
![0]:
2394
case RegexNodeKind.One when !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2395
case RegexNodeKind.Set when !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2396
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2397
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2398
case RegexNodeKind.Multi when !RegexCharClass.CharInClass(subsequent.
Str
![0], node.
Str
!):
2400
case RegexNodeKind.EndZ or RegexNodeKind.Eol when !RegexCharClass.CharInClass('\n', node.
Str
!):
2401
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(node.
Str
!):
2402
case RegexNodeKind.NonBoundary when node.M > 0 && node.
Str
is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass:
2403
case RegexNodeKind.ECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass:
2404
case RegexNodeKind.NonECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass:
2407
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2408
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2442
case RegexNodeKind.Set when !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2444
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2445
case RegexNodeKind.Multi when !CharInStartingOrEndingSet(subsequent.
Str
![0]):
2455
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2591
return
Str
!.Length;
2704
return
Str
!.Length;
2867
if (!Ascii.IsValid(child.
Str
) ||
2868
RegexCharClass.ParticipatesInCaseConversion(child.
Str
.AsSpan()))
2873
vsb.Append(child.
Str
);
2880
if (!RegexCharClass.SetContainsAsciiOrdinalIgnoreCaseCharacter(child.
Str
!, twoChars))
3138
[MemberNotNullWhen(true, nameof(
Str
))]
3219
foreach (char c in
Str
!)
3229
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
;