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;
1165
prev.
Str
= prevCharClass.ToStringClass();
1457
node.
Str
= null;
1463
node.
Str
= null;
1467
node.
Str
= node.Str.Substring(startingSpan.Length);
1717
prev.
Str
= prev.Ch.ToString();
1720
prev.
Str
= (optionsAt & RegexOptions.RightToLeft) == 0 ?
1863
nextNode.
Str
= null;
1867
nextNode.
Str
= nextNode.Str.Substring(matchingCharsInMulti);
3006
Str
= new string(Ch, max);
144 references to Str
System.Text.RegularExpressions (144)
System\Text\RegularExpressions\RegexCompiler.cs (18)
1339
EmitMatchCharacterClass(target.LoopNode.
Str
!);
1448
int length = node.Kind == RegexNodeKind.Multi ? node.
Str
!.Length : 1;
3004
EmitMatchCharacterClass(node.
Str
);
3236
EmitMultiCharString(node.
Str
!, emitLengthCheck, (node.Options & RegexOptions.RightToLeft) != 0);
3746
node.
Str
== RegexCharClass.AnyClass &&
4274
if (node.IsSetFamily && node.
Str
== RegexCharClass.AnyClass)
4416
EmitMatchCharacterClass(node.
Str
);
4451
else if (node.IsSetFamily && maxIterations == int.MaxValue && node.
Str
== RegexCharClass.AnyClass)
4531
EmitMatchCharacterClass(node.
Str
);
4653
EmitMatchCharacterClass(node.
Str
);
5135
literalLength = node.
Str
!.Length;
5148
if (RegexCharClass.TryGetSingleRange(node.
Str
, out _, out _) ||
5149
RegexCharClass.GetSetChars(node.
Str
, setChars) > 0)
5170
Ldstr(node.
Str
!);
5198
bool negated = RegexCharClass.IsNegated(node.
Str
) ^ negate;
5202
if (RegexCharClass.TryGetSingleRange(node.
Str
, out char lowInclusive, out char highInclusive) &&
5219
int setCharsCount = RegexCharClass.GetSetChars(node.
Str
, setChars);
5377
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
!);
1147
prevCharClass = RegexCharClass.Parse(prev.
Str
!);
1160
RegexCharClass atCharClass = RegexCharClass.Parse(at.
Str
!);
1248
required.
Str
!= other.
Str
)
1363
scoped ReadOnlySpan<char> startingSpan = startingNode.
Str
.AsSpan();
1399
Debug.Assert(startingNode.
Str
!.Length > 0);
1401
int minLength = Math.Min(startingSpan.Length, startingNode.
Str
.Length);
1403
while (c < minLength && startingSpan[c] == startingNode.
Str
[c]) c++;
1453
Debug.Assert(node.
Str
.AsSpan().StartsWith(startingSpan, StringComparison.Ordinal));
1454
if (node.
Str
!.Length == startingSpan.Length)
1459
else if (node.
Str
.Length - 1 == startingSpan.Length)
1462
node.Ch = node.
Str
[node.
Str
.Length - 1];
1467
node.Str = node.
Str
.Substring(startingSpan.Length);
1509
return IsOneFamily ? Ch :
Str
![0];
1564
if (RegexCharClass.TryGetSingleRange(node.
Str
!, out char lowInclusive, out char highInclusive) &&
1568
return new StartingLiteralData(range: (lowInclusive, highInclusive), negated: RegexCharClass.IsNegated(node.
Str
!));
1573
if ((numChars = RegexCharClass.GetSetChars(node.
Str
!, setChars)) != 0)
1575
return new StartingLiteralData(setChars: setChars.Slice(0, numChars).ToString(), negated: RegexCharClass.IsNegated(node.
Str
!));
1580
return new StartingLiteralData(@string: node.
Str
);
1721
((at.Kind == RegexNodeKind.One) ? $"{prev.
Str
}{at.Ch}" : prev.
Str
+ at.
Str
) :
1722
((at.Kind == RegexNodeKind.One) ? $"{at.Ch}{prev.
Str
}" : at.
Str
+ prev.
Str
);
1786
case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when nextNode.Kind == currentNode.Kind && currentNode.
Str
== nextNode.
Str
:
1813
case RegexNodeKind.Setloop or RegexNodeKind.Setlazy when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
1830
currentNode.Ch == nextNode.
Str
![0]:
1835
while (matchingCharsInMulti < nextNode.
Str
.Length && currentNode.Ch == nextNode.
Str
[matchingCharsInMulti])
1850
if (nextNode.
Str
.Length == matchingCharsInMulti)
1858
Debug.Assert(matchingCharsInMulti < nextNode.
Str
.Length);
1859
if (nextNode.
Str
.Length - matchingCharsInMulti == 1)
1862
nextNode.Ch = nextNode.
Str
[nextNode.
Str
.Length - 1];
1867
nextNode.Str = nextNode.
Str
.Substring(matchingCharsInMulti);
1881
case RegexNodeKind.Set when (nextNode.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy) && currentNode.
Str
== nextNode.
Str
:
1895
case RegexNodeKind.Set when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
2352
case RegexNodeKind.Set when !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2355
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2356
case RegexNodeKind.Multi when node.Ch != subsequent.
Str
![0]:
2367
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2382
case RegexNodeKind.Multi when node.Ch == subsequent.
Str
![0]:
2399
case RegexNodeKind.One when !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2400
case RegexNodeKind.Set when !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2401
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2402
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2403
case RegexNodeKind.Multi when !RegexCharClass.CharInClass(subsequent.
Str
![0], node.
Str
!):
2405
case RegexNodeKind.EndZ or RegexNodeKind.Eol when !RegexCharClass.CharInClass('\n', node.
Str
!):
2406
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(node.
Str
!):
2407
case RegexNodeKind.NonBoundary when node.M > 0 && node.
Str
is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass:
2408
case RegexNodeKind.ECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass:
2409
case RegexNodeKind.NonECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass:
2412
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2413
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2447
case RegexNodeKind.Set when !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2449
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2450
case RegexNodeKind.Multi when !CharInStartingOrEndingSet(subsequent.
Str
![0]):
2460
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2596
return
Str
!.Length;
2709
return
Str
!.Length;
2872
if (!RegexCharClass.IsAscii(child.
Str
.AsSpan()) ||
2873
RegexCharClass.ParticipatesInCaseConversion(child.
Str
.AsSpan()))
2878
vsb.Append(child.
Str
);
2885
if (!RegexCharClass.SetContainsAsciiOrdinalIgnoreCaseCharacter(child.
Str
!, twoChars))
3143
[MemberNotNullWhen(true, nameof(
Str
))]
3224
foreach (char c in
Str
!)
3234
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
;