mirror of https://github.com/dotnet/runtime
Merge 5277c17d75
into 02596ba8d9
This commit is contained in:
commit
0bc7574779
|
@ -2350,15 +2350,15 @@ namespace System.Text.RegularExpressions
|
|||
case RegexNodeKind.Multi when node.Ch != subsequent.Str![0]:
|
||||
case RegexNodeKind.End:
|
||||
case RegexNodeKind.EndZ or RegexNodeKind.Eol when node.Ch != '\n':
|
||||
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsBoundaryWordChar(node.Ch):
|
||||
case RegexNodeKind.NonBoundary when node.M > 0 && !RegexCharClass.IsBoundaryWordChar(node.Ch):
|
||||
case RegexNodeKind.ECMABoundary when node.M > 0 && RegexCharClass.IsECMAWordChar(node.Ch):
|
||||
case RegexNodeKind.NonECMABoundary when node.M > 0 && !RegexCharClass.IsECMAWordChar(node.Ch):
|
||||
return true;
|
||||
|
||||
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && node.Ch != subsequent.Ch:
|
||||
case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when subsequent.M == 0 && node.Ch == subsequent.Ch:
|
||||
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!):
|
||||
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsBoundaryWordChar(node.Ch):
|
||||
case RegexNodeKind.NonBoundary when node.M > 0 && !RegexCharClass.IsBoundaryWordChar(node.Ch):
|
||||
case RegexNodeKind.ECMABoundary when node.M > 0 && RegexCharClass.IsECMAWordChar(node.Ch):
|
||||
case RegexNodeKind.NonECMABoundary when node.M > 0 && !RegexCharClass.IsECMAWordChar(node.Ch):
|
||||
// The loop can be made atomic based on this subsequent node, but we'll need to evaluate the next one as well.
|
||||
break;
|
||||
|
||||
|
@ -2397,14 +2397,14 @@ namespace System.Text.RegularExpressions
|
|||
case RegexNodeKind.Multi when !RegexCharClass.CharInClass(subsequent.Str![0], node.Str!):
|
||||
case RegexNodeKind.End:
|
||||
case RegexNodeKind.EndZ or RegexNodeKind.Eol when !RegexCharClass.CharInClass('\n', node.Str!):
|
||||
return true;
|
||||
|
||||
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!):
|
||||
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!):
|
||||
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(node.Str!):
|
||||
case RegexNodeKind.NonBoundary when node.M > 0 && node.Str is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass:
|
||||
case RegexNodeKind.ECMABoundary when node.M > 0 && node.Str is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass:
|
||||
case RegexNodeKind.NonECMABoundary when node.M > 0 && node.Str is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass:
|
||||
return true;
|
||||
|
||||
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!):
|
||||
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!):
|
||||
// The loop can be made atomic based on this subsequent node, but we'll need to evaluate the next one as well.
|
||||
break;
|
||||
|
||||
|
@ -2444,14 +2444,14 @@ namespace System.Text.RegularExpressions
|
|||
case RegexNodeKind.Multi when !CharInStartingOrEndingSet(subsequent.Str![0]):
|
||||
case RegexNodeKind.End:
|
||||
case RegexNodeKind.EndZ or RegexNodeKind.Eol when !CharInStartingOrEndingSet('\n'):
|
||||
return true;
|
||||
|
||||
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !CharInStartingOrEndingSet(subsequent.Ch):
|
||||
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!):
|
||||
case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(loopStartingSet) && RegexCharClass.IsKnownWordClassSubset(loopEndingSet):
|
||||
case RegexNodeKind.NonBoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass):
|
||||
case RegexNodeKind.ECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass) && (loopEndingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass):
|
||||
case RegexNodeKind.NonECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass):
|
||||
return true;
|
||||
|
||||
case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !CharInStartingOrEndingSet(subsequent.Ch):
|
||||
case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!):
|
||||
// The loop can be made atomic based on this subsequent node, but we'll need to evaluate the next one as well.
|
||||
break;
|
||||
|
||||
|
|
|
@ -381,8 +381,12 @@ namespace System.Text.RegularExpressions.Tests
|
|||
[InlineData("(a+)b", "((?>a+))b")]
|
||||
[InlineData("a*(?:bcd|efg)", "(?>a*)(?:bcd|efg)")]
|
||||
[InlineData("\\w+\\b", "(?>\\w+)\\b")]
|
||||
[InlineData("\\w+\\ba", "(?>\\w+)\\ba")]
|
||||
[InlineData("\\w+\\b\\w", "(?>\\w+)\\b\\w")]
|
||||
[InlineData("\\d+\\b", "(?>\\d+)\\b")]
|
||||
[InlineData("\\W+\\B", "(?>\\W+)\\B")]
|
||||
[InlineData("\\W+\\B#", "(?>\\W+)\\B#")]
|
||||
[InlineData("\\W+\\B\\W", "(?>\\W+)\\B\\W")]
|
||||
[InlineData("\\D+\\B", "(?>\\D+)\\B")]
|
||||
[InlineData(@"[0-9]+\b", @"(?>[0-9]+)\b")]
|
||||
[InlineData(@"[a-z]+\b", @"(?>[a-z]+)\b")]
|
||||
|
|
Loading…
Reference in New Issue