19 writes to Str
System.Text.RegularExpressions.Generator (19)
src\libraries\System.Text.RegularExpressions\src\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();
1449
node.
Str
= null;
1455
node.
Str
= null;
1459
node.
Str
= node.Str.Substring(startingSpan.Length);
1779
prev.
Str
= prev.Ch.ToString();
1782
prev.
Str
= (optionsAt & RegexOptions.RightToLeft) == 0 ?
1925
nextNode.
Str
= null;
1929
nextNode.
Str
= nextNode.Str.Substring(matchingCharsInMulti);
3124
Str
= new string(Ch, max);
146 references to Str
System.Text.RegularExpressions.Generator (146)
RegexGenerator.Emitter.cs (26)
783
writer.WriteLine($"int end = base.runtextpos = start {(!rtl ? "+" : "-")} {(root.Kind == RegexNodeKind.Multi ? root.
Str
!.Length : 1)};");
1508
writer.Write($"// The pattern begins with an atomic loop for {DescribeSet(target.LoopNode.
Str
!)}, followed by ");
1556
using (EmitBlock(writer, $"while ((uint)prev < (uint)slice.Length && {MatchCharacterClass("slice[prev]", target.LoopNode.
Str
!, negate: false, additionalDeclarations, requiredHelpers)})"))
1894
int numChars = RegexCharClass.GetSetChars(startingLiteralNode.
Str
!, setChars);
1977
return multi.
Str
!.Length == 2 ?
1978
new(RegexNodeKind.One, multi.Options, multi.
Str
[1]) :
1979
new(RegexNodeKind.Multi, multi.Options, multi.
Str
.Substring(1));
3121
EmitMultiCharString(child.
Str
!, emitLengthCheck: false, clauseOnly: true, rightToLeft: false);
3211
MatchCharacterClass(expr, node.
Str
!, negate: true, additionalDeclarations, requiredHelpers) :
3351
Debug.Assert(node.
Str
is not null);
3352
EmitMultiCharString(node.
Str
, emitLengthCheck, clauseOnly: false, (node.Options & RegexOptions.RightToLeft) != 0);
3706
node.
Str
== RegexCharClass.AnyClass &&
4115
else if (node.IsSetFamily && node.
Str
== RegexCharClass.AnyClass)
4230
if (node.IsSetFamily && maxIterations == int.MaxValue && node.
Str
== RegexCharClass.AnyClass)
4242
MatchCharacterClass(expr, node.
Str
!, negate: false, additionalDeclarations, requiredHelpers) :
4253
else if (node.IsSetFamily && maxIterations == int.MaxValue && node.
Str
== RegexCharClass.AnyClass)
4287
MatchCharacterClass(expr, node.
Str
!, negate: false, additionalDeclarations, requiredHelpers) :
4350
MatchCharacterClass(expr, node.
Str
!, negate: false, additionalDeclarations, requiredHelpers) :
5019
indexOfExpr = $"{last}IndexOf({Literal(node.
Str
!)})";
5020
literalLength = node.
Str
!.Length;
5040
bool negated = RegexCharClass.IsNegated(node.
Str
) ^ negate;
5044
if (RegexCharClass.TryGetSingleRange(node.
Str
, out char lowInclusive, out char highInclusive) &&
5059
setChars = setChars.Slice(0, RegexCharClass.GetSetChars(node.
Str
, setChars));
5556
RegexNodeKind.Multi => $"Match the string {Literal(node.
Str
!)}{direction}.",
5567
RegexNodeKind.Set => $"Match {DescribeSet(node.
Str
!)}{direction}.",
5568
RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy => $"Match {DescribeSet(node.
Str
!)} {DescribeLoop(node, rm)}{direction}.",
src\libraries\System.Text.RegularExpressions\src\System\Text\RegularExpressions\RegexNode.cs (95)
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
!);
1232
required.
Str
!= other.
Str
)
1355
scoped ReadOnlySpan<char> startingSpan = startingNode.
Str
.AsSpan();
1391
Debug.Assert(startingNode.
Str
!.Length > 0);
1393
int minLength = Math.Min(startingSpan.Length, startingNode.
Str
.Length);
1395
while (c < minLength && startingSpan[c] == startingNode.
Str
[c]) c++;
1445
Debug.Assert(node.
Str
.AsSpan().StartsWith(startingSpan, StringComparison.Ordinal));
1446
if (node.
Str
!.Length == startingSpan.Length)
1451
else if (node.
Str
.Length - 1 == startingSpan.Length)
1454
node.Ch = node.
Str
[node.
Str
.Length - 1];
1459
node.Str = node.
Str
.Substring(startingSpan.Length);
1501
return IsOneFamily ? Ch :
Str
![0];
1552
if (RegexCharClass.IsNegated(startingLiteralNode.
Str
!) ||
1553
(numChars = RegexCharClass.GetSetChars(startingLiteralNode.
Str
!, setChars)) == 0)
1626
if (RegexCharClass.TryGetSingleRange(node.
Str
!, out char lowInclusive, out char highInclusive) &&
1630
return new StartingLiteralData(range: (lowInclusive, highInclusive), negated: RegexCharClass.IsNegated(node.
Str
!));
1635
if ((numChars = RegexCharClass.GetSetChars(node.
Str
!, setChars)) != 0)
1637
return new StartingLiteralData(setChars: setChars.Slice(0, numChars).ToString(), negated: RegexCharClass.IsNegated(node.
Str
!));
1642
return new StartingLiteralData(@string: node.
Str
);
1783
((at.Kind == RegexNodeKind.One) ? $"{prev.
Str
}{at.Ch}" : prev.
Str
+ at.
Str
) :
1784
((at.Kind == RegexNodeKind.One) ? $"{at.Ch}{prev.
Str
}" : at.
Str
+ prev.
Str
);
1848
case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when nextNode.Kind == currentNode.Kind && currentNode.
Str
== nextNode.
Str
:
1875
case RegexNodeKind.Setloop or RegexNodeKind.Setlazy when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
1892
currentNode.Ch == nextNode.
Str
![0]:
1897
while (matchingCharsInMulti < nextNode.
Str
.Length && currentNode.Ch == nextNode.
Str
[matchingCharsInMulti])
1912
if (nextNode.
Str
.Length == matchingCharsInMulti)
1920
Debug.Assert(matchingCharsInMulti < nextNode.
Str
.Length);
1921
if (nextNode.
Str
.Length - matchingCharsInMulti == 1)
1924
nextNode.Ch = nextNode.
Str
[nextNode.
Str
.Length - 1];
1929
nextNode.Str = nextNode.
Str
.Substring(matchingCharsInMulti);
1943
case RegexNodeKind.Set when (nextNode.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy) && currentNode.
Str
== nextNode.
Str
:
1957
case RegexNodeKind.Set when nextNode.Kind == RegexNodeKind.Set && currentNode.
Str
== nextNode.
Str
:
2424
case RegexNodeKind.Set when !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2427
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2428
case RegexNodeKind.Multi when node.Ch != subsequent.
Str
![0]:
2439
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.
Str
!):
2454
case RegexNodeKind.Multi when node.Ch == subsequent.
Str
![0]:
2471
case RegexNodeKind.One when !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2472
case RegexNodeKind.Set when !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2473
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2474
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2475
case RegexNodeKind.Multi when !RegexCharClass.CharInClass(subsequent.
Str
![0], node.
Str
!):
2477
case RegexNodeKind.EndZ or RegexNodeKind.Eol when !RegexCharClass.CharInClass('\n', node.
Str
!):
2478
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(node.
Str
!):
2479
case RegexNodeKind.NonBoundary when node.M > 0 && node.
Str
is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass:
2480
case RegexNodeKind.ECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass:
2481
case RegexNodeKind.NonECMABoundary when node.M > 0 && node.
Str
is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass:
2484
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.
Str
!):
2485
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.
Str
!, subsequent.
Str
!):
2519
case RegexNodeKind.Set when !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2521
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2522
case RegexNodeKind.Multi when !CharInStartingOrEndingSet(subsequent.
Str
![0]):
2532
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.
Str
!):
2714
return
Str
!.Length;
2827
return
Str
!.Length;
2990
if (!Ascii.IsValid(child.
Str
) ||
2991
RegexCharClass.ParticipatesInCaseConversion(child.
Str
.AsSpan()))
2996
vsb.Append(child.
Str
);
3003
if (!RegexCharClass.SetContainsAsciiOrdinalIgnoreCaseCharacter(child.
Str
!, twoChars))
3261
[MemberNotNullWhen(true, nameof(
Str
))]
3342
foreach (char c in
Str
!)
3352
sb.Append(' ').Append(RegexCharClass.DescribeSet(
Str
!));
src\libraries\System.Text.RegularExpressions\src\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"/>.
src\libraries\System.Text.RegularExpressions\src\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
!))