1
1
using System . Globalization ;
2
2
using System . Linq . Dynamic . Core . Exceptions ;
3
- using System . Text ;
4
3
using System . Text . RegularExpressions ;
5
4
6
5
namespace System . Linq . Dynamic . Core . Parser
@@ -13,69 +12,30 @@ internal static class StringParser
13
12
{
14
13
public static string ParseString ( string s )
15
14
{
16
- var inputStringBuilder = new StringBuilder ( s ) ;
17
- var tempStringBuilder = new StringBuilder ( ) ;
18
- string found = null ;
19
-
20
- char quote = inputStringBuilder [ 0 ] ;
21
- int pos = 1 ;
22
-
23
- while ( pos < inputStringBuilder . Length )
15
+ if ( s == null || s . Length < 2 )
24
16
{
25
- char ch = inputStringBuilder [ pos ] ;
26
-
27
- if ( ch == '\\ ' && pos + 1 < inputStringBuilder . Length && ( inputStringBuilder [ pos + 1 ] == '\\ ' || inputStringBuilder [ pos + 1 ] == quote ) )
28
- {
29
- tempStringBuilder . Append ( inputStringBuilder [ pos + 1 ] ) ;
30
- pos ++ ; // Treat as escape character for \\ or \'
31
- }
32
- else if ( ch == '\\ ' && pos + 1 < inputStringBuilder . Length && inputStringBuilder [ pos + 1 ] == 'u' )
33
- {
34
- if ( pos + 5 >= inputStringBuilder . Length )
35
- {
36
- throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . UnexpectedUnrecognizedEscapeSequence , pos , inputStringBuilder . ToString ( pos , inputStringBuilder . Length - pos - 1 ) ) , pos ) ;
37
- }
38
-
39
- string unicode = inputStringBuilder . ToString ( pos , 6 ) ;
40
- tempStringBuilder . Append ( Regex . Unescape ( unicode ) ) ;
41
- pos += 5 ;
42
- }
43
- else if ( ch == quote )
44
- {
45
- found = Replace ( tempStringBuilder ) ;
46
- break ;
47
- }
48
- else
49
- {
50
- tempStringBuilder . Append ( ch ) ;
51
- }
52
-
53
- pos ++ ;
17
+ throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . InvalidStringLength , s , 2 ) , 0 ) ;
54
18
}
55
19
56
- if ( found == null )
20
+ if ( s [ 0 ] != '"' && s [ 0 ] != ' \' ' )
57
21
{
58
- throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . UnexpectedUnclosedString , pos , inputStringBuilder . ToString ( ) ) , pos ) ;
22
+ throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . InvalidStringQuoteCharacter ) , 0 ) ;
59
23
}
60
24
61
- return found ;
62
- }
63
-
64
- private static string Replace ( StringBuilder inputStringBuilder )
65
- {
66
- var sb = new StringBuilder ( inputStringBuilder . ToString ( ) )
67
- . Replace ( @"\\" , "\\ " ) // \\ – backslash
68
- . Replace ( @"\0" , "\0 " ) // Unicode character 0
69
- . Replace ( @"\a" , "\a " ) // Alert(character 7)
70
- . Replace ( @"\b" , "\b " ) // Backspace(character 8)
71
- . Replace ( @"\f" , "\f " ) // Form feed(character 12)
72
- . Replace ( @"\n" , "\n " ) // New line(character 10)
73
- . Replace ( @"\r" , "\r " ) // Carriage return (character 13)
74
- . Replace ( @"\t" , "\t " ) // Horizontal tab(character 9)
75
- . Replace ( @"\v" , "\v " ) // Vertical quote(character 11)
76
- ;
25
+ char quote = s [ 0 ] ; // This can be single or a double quote
26
+ if ( s . Last ( ) != quote )
27
+ {
28
+ throw new ParseException ( string . Format ( CultureInfo . CurrentCulture , Res . UnexpectedUnclosedString , s . Length , s ) , s . Length ) ;
29
+ }
77
30
78
- return sb . ToString ( ) ;
31
+ try
32
+ {
33
+ return Regex . Unescape ( s . Substring ( 1 , s . Length - 2 ) ) ;
34
+ }
35
+ catch ( Exception ex )
36
+ {
37
+ throw new ParseException ( ex . Message , 0 ) ;
38
+ }
79
39
}
80
40
}
81
41
}
0 commit comments