/* * This static call constructs a RegexTree from a regular expression * pattern string and an option string. * * The method creates, drives, and drops a parser instance. */ internal static RegexTree Parse(string re, RegexOptions op) { int end; var pcreOptions = TrimPcreRegexOption(re, out end); var pattern = TrimDelimiters(re, end); RegexParser p; RegexNode root; string[] capnamelist; p = new RegexParser((op & RegexOptions.CultureInvariant) != 0 ? CultureInfo.InvariantCulture : CultureInfo.CurrentCulture); p._options = op; p.SetPattern(pattern); p.CountCaptures(); p.Reset(op); root = p.ScanRegex(); if (p._capnamelist == null) capnamelist = null; else capnamelist = p._capnamelist.ToArray(); return new RegexTree(root, p._caps, p._capnumlist, p._captop, p._capnames, capnamelist, op); }
/* * Escapes all metacharacters (including (,),[,],{,},|,^,$,*,+,?,\, spaces and #) */ internal static string Unescape(string input) { for (int i = 0; i < input.Length; i++) { if (input[i] == '\\') { var sb = new StringBuilder(); RegexParser p = new RegexParser(CultureInfo.InvariantCulture); int lastpos; p.SetPattern(input); sb.Append(input, 0, i); do { i++; p.Textto(i); if (i < input.Length) sb.Append(p.ScanCharEscape()); i = p.Textpos(); lastpos = i; while (i < input.Length && input[i] != '\\') i++; sb.Append(input, lastpos, i - lastpos); } while (i < input.Length); return sb.ToString(); } } return input; }
/* * This static call constructs a flat concatenation node given * a replacement pattern. */ internal static RegexReplacement ParseReplacement(string rep, Dictionary<int, int> caps, int capsize, Dictionary<string, int> capnames, RegexOptions op) { RegexParser p; RegexNode root; p = new RegexParser((op & RegexOptions.CultureInvariant) != 0 ? CultureInfo.InvariantCulture : CultureInfo.CurrentCulture); p._options = op; p.NoteCaptures(caps, capsize, capnames); p.SetPattern(rep); root = p.ScanReplacement(); return new RegexReplacement(rep, root, caps); }