@@ -15,40 +15,37 @@ public class ExpressionEvaluator
1515 {
1616 #region Regex declarations
1717
18- private static Regex varOrFunctionRegEx = new Regex ( @"^((?<sign>[+-])|(?<inObject>(?<nullConditional>[?])?\.)?)(?<name>[a-zA-Z_][a-zA-Z0-9_]*)\s*((?<assignationOperator>(?<assignmentPrefix>[+\-*/%&|^]|<<|>>)?=(?![=>]))|(?<postfixOperator>([+][+]|--)(?![a-zA-Z0-9_]))|((?<isgeneric>[<](?>[^<>]+|(?<gentag>[<])|(?<-gentag>[>]))*(?(gentag)(?!))[>])?(?<isfunction>[(])?))" , RegexOptions . IgnoreCase ) ;
19- private static Regex numberRegex = new Regex ( @"^(?<sign>[+-])?\d+(?<hasdecimal>\.?\d+(e[+-]?\d+)?)?(?<type>ul|[fdulm])?" , RegexOptions . IgnoreCase ) ;
20- private static Regex stringBeginningRegex = new Regex ( "^(?<interpolated>[$])?(?<escaped>[@])?[\" ]" ) ;
21- private static Regex internalCharRegex = new Regex ( @"^['](\\[']|[^'])*[']" ) ;
18+ private static Regex varOrFunctionRegEx = new Regex ( @"^((?<sign>[+-])|(?<inObject>(?<nullConditional>[?])?\.)?)(?<name>[a-zA-Z_][a-zA-Z0-9_]*)\s*((?<assignationOperator>(?<assignmentPrefix>[+\-*/%&|^]|<<|>>)?=(?![=>]))|(?<postfixOperator>([+][+]|--)(?![a-zA-Z0-9_]))|((?<isgeneric>[<](?>[^<>]+|(?<gentag>[<])|(?<-gentag>[>]))*(?(gentag)(?!))[>])?(?<isfunction>[(])?))" , RegexOptions . IgnoreCase | RegexOptions . Compiled ) ;
19+ private static Regex numberRegex = new Regex ( @"^(?<sign>[+-])?\d+(?<hasdecimal>\.?\d+(e[+-]?\d+)?)?(?<type>ul|[fdulm])?" , RegexOptions . IgnoreCase | RegexOptions . Compiled ) ;
20+ private static Regex stringBeginningRegex = new Regex ( "^(?<interpolated>[$])?(?<escaped>[@])?[\" ]" , RegexOptions . Compiled ) ;
21+ private static Regex internalCharRegex = new Regex ( @"^['](\\[']|[^'])*[']" , RegexOptions . Compiled ) ;
2222 private static Regex castRegex = new Regex ( @"^\(\s*(?<typeName>[a-zA-Z_][a-zA-Z0-9_\.\[\]<>]*[?]?)\s*\)" ) ;
23- private static Regex indexingBeginningRegex = new Regex ( @"^[?]?\[" ) ;
24- private static Regex endOfStringWithDollar = new Regex ( "^[^\" {]*[\" {]" ) ;
25- private static Regex endOfStringWithoutDollar = new Regex ( "^[^\" ]*[\" ]" ) ;
26- private static Regex endOfStringInterpolationRegex = new Regex ( "^[^}\" ]*[}\" ]" ) ;
27- private static Regex stringBeginningForEndBlockRegex = new Regex ( "[$]?[@]?[\" ]$" ) ;
28- private static Regex lambdaExpressionRegex = new Regex ( @"^\s*(?<args>(\s*[(]\s*([a-zA-Z_][a-zA-Z0-9_]*\s*([,]\s*[a-zA-Z_][a-zA-Z0-9_]*\s*)*)?[)])|[a-zA-Z_][a-zA-Z0-9_]*)\s*=>(?<expression>.*)$" , RegexOptions . Singleline ) ;
29- private static Regex lambdaArgRegex = new Regex ( @"[a-zA-Z_][a-zA-Z0-9_]*" ) ;
23+ private static Regex indexingBeginningRegex = new Regex ( @"^[?]?\[" , RegexOptions . Compiled ) ;
24+ private static Regex endOfStringWithDollar = new Regex ( "^[^\" {]*[\" {]" , RegexOptions . Compiled ) ;
25+ private static Regex endOfStringWithoutDollar = new Regex ( "^[^\" ]*[\" ]" , RegexOptions . Compiled ) ;
26+ private static Regex endOfStringInterpolationRegex = new Regex ( "^[^}\" ]*[}\" ]" , RegexOptions . Compiled ) ;
27+ private static Regex stringBeginningForEndBlockRegex = new Regex ( "[$]?[@]?[\" ]$" , RegexOptions . Compiled ) ;
28+ private static Regex lambdaExpressionRegex = new Regex ( @"^\s*(?<args>(\s*[(]\s*([a-zA-Z_][a-zA-Z0-9_]*\s*([,]\s*[a-zA-Z_][a-zA-Z0-9_]*\s*)*)?[)])|[a-zA-Z_][a-zA-Z0-9_]*)\s*=>(?<expression>.*)$" , RegexOptions . Singleline | RegexOptions . Compiled ) ;
29+ private static Regex lambdaArgRegex = new Regex ( @"[a-zA-Z_][a-zA-Z0-9_]*" , RegexOptions . Compiled ) ;
3030
3131 private static readonly string instanceCreationWithNewKeywordRegexPattern = @"^new\s+(?<name>[a-zA-Z_][a-zA-Z0-9_.]*)\s*(?<isgeneric>[<](?>[^<>]+|(?<gentag>[<])|(?<-gentag>[>]))*(?(gentag)(?!))[>])?(?<isfunction>[(])?" ;
32- private Regex instanceCreationWithNewKeywordRegex = new Regex ( instanceCreationWithNewKeywordRegexPattern ) ;
32+ private Regex instanceCreationWithNewKeywordRegex = new Regex ( instanceCreationWithNewKeywordRegexPattern , RegexOptions . Compiled ) ;
3333 private static readonly string primaryTypesRegexPattern = @"(?<=^|[^a-zA-Z_])(?<primaryType>object|string|bool[?]?|byte[?]?|char[?]?|decimal[?]?|double[?]?|short[?]?|int[?]?|long[?]?|sbyte[?]?|float[?]?|ushort[?]?|uint[?]?|void)(?=[^a-zA-Z_]|$)" ;
34- private Regex primaryTypesRegex = new Regex ( primaryTypesRegexPattern ) ;
34+ private Regex primaryTypesRegex = new Regex ( primaryTypesRegexPattern , RegexOptions . Compiled ) ;
3535
3636 // To remove comments in scripts based on https://stackoverflow.com/questions/3524317/regex-to-strip-line-comments-from-c-sharp/3524689#3524689
3737 private static readonly string blockComments = @"/\*(.*?)\*/" ;
3838 private static readonly string lineComments = @"//[^\r\n]*" ;
3939 private static readonly string stringsIgnore = @"""((\\[^\n]|[^""\n])*)""" ;
4040 private static readonly string verbatimStringsIgnore = @"@(""[^""]*"")+" ;
41- private static readonly Regex removeCommentsRegex = new Regex ( $ "{ blockComments } |{ lineComments } |{ stringsIgnore } |{ verbatimStringsIgnore } ", RegexOptions . Singleline ) ;
42- private static readonly Regex newLineCharsRegex = new Regex ( @"\r\n|\r|\n" ) ;
41+ private static readonly Regex removeCommentsRegex = new Regex ( $ "{ blockComments } |{ lineComments } |{ stringsIgnore } |{ verbatimStringsIgnore } ", RegexOptions . Singleline | RegexOptions . Compiled ) ;
42+ private static readonly Regex newLineCharsRegex = new Regex ( @"\r\n|\r|\n" , RegexOptions . Compiled ) ;
4343
4444 // For script only
45- private static readonly Regex variableAssignationRegex = new Regex ( @"^(?<name>[a-zA-Z_][a-zA-Z0-9_]*)\s*(?<assignmentPrefix>[+\-*/%&|^]|<<|>>)?=(?![=>])" ) ;
46- private static readonly Regex blockKeywordsBeginningRegex = new Regex ( @"^\s*(?<keyword>while|for|if|else\s+if)\s*[(]" , RegexOptions . IgnoreCase ) ;
47- private static readonly Regex elseblockKeywordsBeginningRegex = new Regex ( @"^\s*(?<keyword>else)(?![a-zA-Z0-9_])" , RegexOptions . IgnoreCase ) ;
48- private static readonly Regex blockBeginningRegex = new Regex ( @"^\s*[{]" ) ;
49- private static readonly Regex returnKeywordRegex = new Regex ( @"^return(\s+|\()" , RegexOptions . IgnoreCase | RegexOptions . Singleline ) ;
50-
51- //private static readonly string tryToMatchSetPropertyRegexPattern = @"^(?<toEvaluate>([a-zA-Z_][a-zA-Z0-9_]*\s*(?<isgeneric>[(](?>[^()""]+|(?<parenthis>[(])|(?<-parenthis>[)]))*(?(parenthis) (?!))[)])*\.)+)(?<propertyToSet>[a-zA-Z_] [a-zA-Z0-9_]*)";
45+ private static readonly Regex blockKeywordsBeginningRegex = new Regex ( @"^\s*(?<keyword>while|for|if|else\s+if)\s*[(]" , RegexOptions . IgnoreCase | RegexOptions . Compiled ) ;
46+ private static readonly Regex elseblockKeywordsBeginningRegex = new Regex ( @"^\s*(?<keyword>else)(?![a-zA-Z0-9_])" , RegexOptions . IgnoreCase | RegexOptions . Compiled ) ;
47+ private static readonly Regex blockBeginningRegex = new Regex ( @"^\s*[{]" , RegexOptions . Compiled ) ;
48+ private static readonly Regex returnKeywordRegex = new Regex ( @"^return(\s+|\()" , RegexOptions . IgnoreCase | RegexOptions . Singleline | RegexOptions . Compiled ) ;
5249
5350 #endregion
5451
@@ -427,8 +424,8 @@ public bool OptionCaseSensitiveEvaluationActive
427424 simpleDoubleMathFuncsDictionary = new Dictionary < string , Func < double , double > > ( simpleDoubleMathFuncsDictionary , StringComparerForCasing ) ;
428425 doubleDoubleMathFuncsDictionary = new Dictionary < string , Func < double , double , double > > ( doubleDoubleMathFuncsDictionary , StringComparerForCasing ) ;
429426 complexStandardFuncsDictionary = new Dictionary < string , Func < ExpressionEvaluator , List < string > , object > > ( complexStandardFuncsDictionary , StringComparerForCasing ) ;
430- instanceCreationWithNewKeywordRegex = new Regex ( instanceCreationWithNewKeywordRegexPattern , optionCaseSensitiveEvaluationActive ? RegexOptions . None : RegexOptions . IgnoreCase ) ;
431- primaryTypesRegex = new Regex ( primaryTypesRegexPattern , optionCaseSensitiveEvaluationActive ? RegexOptions . None : RegexOptions . IgnoreCase ) ;
427+ instanceCreationWithNewKeywordRegex = new Regex ( instanceCreationWithNewKeywordRegexPattern , ( optionCaseSensitiveEvaluationActive ? RegexOptions . None : RegexOptions . IgnoreCase ) | RegexOptions . Compiled ) ;
428+ primaryTypesRegex = new Regex ( primaryTypesRegexPattern , ( optionCaseSensitiveEvaluationActive ? RegexOptions . None : RegexOptions . IgnoreCase ) | RegexOptions . Compiled ) ;
432429 }
433430 }
434431
0 commit comments