private static void ParseRegexOptions(StringBuilder pattern, int start,
out RegexOptions dotNetOptions, out PerlRegexOptions extraOptions)
{
dotNetOptions = RegexOptions.None;
extraOptions = PerlRegexOptions.None;
for (int i = start; i < pattern.Length; i++)
{
char option = pattern[i];
switch (option)
{
case 'i': // PCRE_CASELESS
dotNetOptions |= RegexOptions.IgnoreCase;
break;
case 'm': // PCRE_MULTILINE
dotNetOptions |= RegexOptions.Multiline;
break;
case 's': // PCRE_DOTALL
dotNetOptions |= RegexOptions.Singleline;
break;
case 'x': // PCRE_EXTENDED
dotNetOptions |= RegexOptions.IgnorePatternWhitespace;
break;
case 'e': // evaluate as PHP code
extraOptions |= PerlRegexOptions.Evaluate;
break;
case 'A': // PCRE_ANCHORED
extraOptions |= PerlRegexOptions.Anchored;
break;
case 'D': // PCRE_DOLLAR_ENDONLY
extraOptions |= PerlRegexOptions.DollarMatchesEndOfStringOnly;
break;
case 'S': // spend more time studythe pattern - ignore
break;
case 'U': // PCRE_UNGREEDY
extraOptions |= PerlRegexOptions.Ungreedy;
break;
case 'u': // PCRE_UTF8
extraOptions |= PerlRegexOptions.UTF8;
break;
/*
case 'X': // PCRE_EXTRA
throw new Exception("Modifier not supported");
default:
throw new Exception("Modifier unknown");
*/
}
}
// inconsistent options check:
if
(
(dotNetOptions & RegexOptions.Multiline) != 0 &&
(extraOptions & PerlRegexOptions.DollarMatchesEndOfStringOnly) != 0
)
{
throw new Exception("Modifier inconsistent");
}
}