private static string TrimDelimiters(string re, int end)
{
Debug.Assert(re != null);
Debug.Assert(end <= re.Length);
Debug.Assert(re.Length != 0);
if (end > 0)
{
var end_delimiter = re[end - 1]; // last char
if (char.IsLetterOrDigit(end_delimiter) || end_delimiter == '\\')
{
throw new ArgumentException("delimiter_alnum_backslash");
}
char start_delimiter;
if (end_delimiter == ']') start_delimiter = '[';
else if (end_delimiter == ')') start_delimiter = '(';
else if (end_delimiter == '}') start_delimiter = '{';
else if (end_delimiter == '>') start_delimiter = '<';
else start_delimiter = end_delimiter;
// skip trailing whitespaces
int i = 0;
while (i < re.Length && char.IsWhiteSpace(re[i]))
{
i++;
}
if (i < end)
{
if (re[i] == start_delimiter)
{
return re.Substring(i + 1, end - i - 2);
}
else
{
throw new ArgumentException("preg_no_end_delimiter");
}
}
}
throw new ArgumentException("regular_expression_empty");
}