1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Diagnostics ;
2
4
using System . Linq ;
3
5
using System . Text . RegularExpressions ;
4
6
@@ -9,9 +11,6 @@ internal class StringLiteralAndBracketEscaper
9
11
public const char StringPlaceholder = '\a ' ;
10
12
public const char BracketPlaceholder = '\x02 ' ;
11
13
12
- private static readonly Regex StringReplaceRegex = new Regex ( "\a +" , RegexOptions . IgnoreCase ) ;
13
- private static readonly Regex BracketReplaceRegex = new Regex ( "\x02 +" , RegexOptions . IgnoreCase ) ;
14
-
15
14
private readonly List < string > _strings = new List < string > ( ) ;
16
15
private readonly List < string > _brackets = new List < string > ( ) ;
17
16
@@ -24,16 +23,20 @@ internal class StringLiteralAndBracketEscaper
24
23
25
24
public string UnescapeIndented ( string indented )
26
25
{
27
- var code = indented ;
28
- if ( _strings . Any ( ) )
29
- {
30
- code = _strings . Aggregate ( code , ( current , literal ) => StringReplaceRegex . Replace ( current , literal , 1 ) ) ;
31
- }
32
- if ( _brackets . Any ( ) )
26
+
27
+ var code = ReplaceEscapedItems ( indented , StringPlaceholder , EscapedStrings ) ;
28
+ return ReplaceEscapedItems ( code , BracketPlaceholder , EscapedBrackets ) ;
29
+ }
30
+
31
+ private string ReplaceEscapedItems ( string code , char placehoder , IEnumerable < string > replacements )
32
+ {
33
+ var output = code ;
34
+ foreach ( var item in replacements )
33
35
{
34
- code = _brackets . Aggregate ( code , ( current , expr ) => BracketReplaceRegex . Replace ( current , expr , 1 ) ) ;
36
+ var pos = output . IndexOf ( new string ( placehoder , item . Length ) , StringComparison . Ordinal ) ;
37
+ output = output . Substring ( 0 , pos ) + item + output . Substring ( pos + item . Length ) ;
35
38
}
36
- return code ;
39
+ return output ;
37
40
}
38
41
39
42
public StringLiteralAndBracketEscaper ( string code )
@@ -56,13 +59,13 @@ public StringLiteralAndBracketEscaper(string code)
56
59
quoted = true ;
57
60
continue ;
58
61
}
59
- if ( c + 1 < chars . Length && chars [ c ] == '"' )
62
+ if ( c + 1 < chars . Length && chars [ c + 1 ] == '"' )
60
63
{
61
64
c ++ ;
62
65
}
63
66
quoted = false ;
64
- _strings . Add ( new string ( chars . Skip ( strpos ) . Take ( c - strpos ) . ToArray ( ) ) ) ;
65
- for ( var e = strpos ; e < c ; e ++ )
67
+ _strings . Add ( OriginalString . Substring ( strpos , c - strpos + 1 ) ) ;
68
+ for ( var e = strpos ; e <= c ; e ++ )
66
69
{
67
70
chars [ e ] = StringPlaceholder ;
68
71
}
@@ -81,7 +84,7 @@ public StringLiteralAndBracketEscaper(string code)
81
84
continue ;
82
85
}
83
86
bracketed = false ;
84
- _brackets . Add ( new string ( chars . Skip ( brkpos ) . Take ( c - brkpos + 1 ) . ToArray ( ) ) ) ;
87
+ _brackets . Add ( OriginalString . Substring ( brkpos , c - brkpos + 1 ) ) ;
85
88
for ( var e = brkpos ; e <= c ; e ++ )
86
89
{
87
90
chars [ e ] = BracketPlaceholder ;
0 commit comments