+++ /dev/null
-//\r
-// assembly: System\r
-// namespace: System.Text.RegularExpressions\r
-// file: regex.cs\r
-//\r
-// author: Dan Lewis (dlewis@gmx.co.uk)\r
-// (c) 2002\r
-\r
-//\r
-// Permission is hereby granted, free of charge, to any person obtaining\r
-// a copy of this software and associated documentation files (the\r
-// "Software"), to deal in the Software without restriction, including\r
-// without limitation the rights to use, copy, modify, merge, publish,\r
-// distribute, sublicense, and/or sell copies of the Software, and to\r
-// permit persons to whom the Software is furnished to do so, subject to\r
-// the following conditions:\r
-// \r
-// The above copyright notice and this permission notice shall be\r
-// included in all copies or substantial portions of the Software.\r
-// \r
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
-//\r
-\r
-using System;\r
-using System.Text;\r
-using System.Collections;\r
-using System.Reflection;\r
-using System.Reflection.Emit;\r
-using System.Runtime.Serialization;\r
-\r
-using RegularExpression = System.Text.RegularExpressions.Syntax.RegularExpression;\r
-using Parser = System.Text.RegularExpressions.Syntax.Parser;\r
-\r
-using System.Diagnostics;\r
-\r
-\r
-namespace System.Text.RegularExpressions {\r
- \r
- public delegate string MatchEvaluator (Match match);\r
-\r
- delegate void MatchAppendEvaluator (Match match, StringBuilder sb);\r
-\r
- [Flags]\r
- public enum RegexOptions {\r
- None = 0x000,\r
- IgnoreCase = 0x001,\r
- Multiline = 0x002,\r
- ExplicitCapture = 0x004,\r
- Compiled = 0x008,\r
- Singleline = 0x010,\r
- IgnorePatternWhitespace = 0x020,\r
- RightToLeft = 0x040,\r
- ECMAScript = 0x100,\r
- CultureInvariant = 0x200 \r
- }\r
- \r
- [Serializable]\r
- public class Regex : ISerializable {\r
- public static void CompileToAssembly\r
- (RegexCompilationInfo[] regexes, AssemblyName aname)\r
- {\r
- Regex.CompileToAssembly(regexes, aname, new CustomAttributeBuilder[] {}, null);\r
- }\r
-\r
- public static void CompileToAssembly\r
- (RegexCompilationInfo[] regexes, AssemblyName aname,\r
- CustomAttributeBuilder[] attribs)\r
- {\r
- Regex.CompileToAssembly(regexes, aname, attribs, null);\r
- }\r
-\r
- [MonoTODO]\r
- public static void CompileToAssembly\r
- (RegexCompilationInfo[] regexes, AssemblyName aname,\r
- CustomAttributeBuilder[] attribs, string resourceFile)\r
- {\r
- throw new NotImplementedException ();\r
- // TODO : Make use of attribs and resourceFile parameters\r
- /*\r
- AssemblyBuilder asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly (aname, AssemblyBuilderAccess.RunAndSave);\r
- ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("InnerRegexModule",aname.Name);\r
- Parser psr = new Parser (); \r
- \r
- System.Console.WriteLine("CompileToAssembly");\r
- \r
- for(int i=0; i < regexes.Length; i++)\r
- {\r
- System.Console.WriteLine("Compiling expression :" + regexes[i].Pattern);\r
- RegularExpression re = psr.ParseRegularExpression (regexes[i].Pattern, regexes[i].Options);\r
- \r
- // compile\r
- \r
- CILCompiler cmp = new CILCompiler (modBuilder, i);\r
- bool reverse = (regexes[i].Options & RegexOptions.RightToLeft) !=0;\r
- re.Compile (cmp, reverse);\r
- cmp.Close();\r
- \r
- }\r
- \r
-\r
- // Define a runtime class with specified name and attributes.\r
- TypeBuilder builder = modBuilder.DefineType("ITest");\r
- builder.CreateType();\r
- asmBuilder.Save(aname.Name);\r
- */\r
- }\r
- \r
- public static string Escape (string str) {\r
- return Parser.Escape (str);\r
- }\r
-\r
- public static string Unescape (string str) {\r
- return Parser.Unescape (str);\r
- }\r
-\r
- public static bool IsMatch (string input, string pattern) {\r
- return IsMatch (input, pattern, RegexOptions.None);\r
- }\r
-\r
- public static bool IsMatch (string input, string pattern, RegexOptions options) {\r
- Regex re = new Regex (pattern, options);\r
- return re.IsMatch (input);\r
- }\r
-\r
- public static Match Match (string input, string pattern) {\r
- return Regex.Match (input, pattern, RegexOptions.None);\r
- }\r
-\r
- public static Match Match (string input, string pattern, RegexOptions options) {\r
- Regex re = new Regex (pattern, options);\r
- return re.Match (input);\r
- }\r
-\r
- public static MatchCollection Matches (string input, string pattern) {\r
- return Matches (input, pattern, RegexOptions.None);\r
- }\r
-\r
- public static MatchCollection Matches (string input, string pattern, RegexOptions options) {\r
- Regex re = new Regex (pattern, options);\r
- return re.Matches (input);\r
- }\r
-\r
- public static string Replace\r
- (string input, string pattern, MatchEvaluator evaluator)\r
- {\r
- return Regex.Replace (input, pattern, evaluator, RegexOptions.None);\r
- }\r
-\r
- public static string Replace\r
- (string input, string pattern, MatchEvaluator evaluator,\r
- RegexOptions options)\r
- {\r
- Regex re = new Regex (pattern, options);\r
- return re.Replace (input, evaluator);\r
- }\r
-\r
- public static string Replace\r
- (string input, string pattern, string replacement)\r
- {\r
- return Regex.Replace (input, pattern, replacement, RegexOptions.None);\r
- }\r
-\r
- public static string Replace\r
- (string input, string pattern, string replacement,\r
- RegexOptions options)\r
- {\r
- Regex re = new Regex (pattern, options);\r
- return re.Replace (input, replacement);\r
- }\r
-\r
- public static string[] Split (string input, string pattern) {\r
- return Regex.Split (input, pattern, RegexOptions.None);\r
- }\r
-\r
- public static string[] Split (string input, string pattern, RegexOptions options) {\r
- Regex re = new Regex (pattern, options);\r
- return re.Split (input);\r
- }\r
-\r
- // private\r
-\r
- private static FactoryCache cache = new FactoryCache (200); // TODO put some meaningful number here\r
-\r
- // constructors\r
-\r
- protected Regex () {\r
- // XXX what's this constructor for?\r
- // : Used to compile to assembly (Custum regex inherit from Regex and use this constructor)\r
- }\r
-\r
- public Regex (string pattern) : this (pattern, RegexOptions.None) {\r
- }\r
-\r
- public Regex (string pattern, RegexOptions options) {\r
- this.pattern = pattern;\r
- this.roptions = options;\r
- \r
- this.machineFactory = cache.Lookup (pattern, options);\r
-\r
- if (this.machineFactory == null) {\r
- // parse and install group mapping\r
-\r
- Parser psr = new Parser ();\r
- RegularExpression re = psr.ParseRegularExpression (pattern, options);\r
- this.group_count = re.GroupCount;\r
- this.mapping = psr.GetMapping ();\r
-\r
- // compile\r
- \r
- ICompiler cmp;\r
- //if ((options & RegexOptions.Compiled) != 0)\r
- // //throw new Exception ("Not implemented.");\r
- // cmp = new CILCompiler ();\r
- //else\r
- cmp = new PatternCompiler ();\r
-\r
- re.Compile (cmp, RightToLeft);\r
-\r
- // install machine factory and add to pattern cache\r
-\r
- this.machineFactory = cmp.GetMachineFactory ();\r
- this.machineFactory.Mapping = mapping;\r
- cache.Add (pattern, options, this.machineFactory);\r
- } else {\r
- this.group_count = this.machineFactory.GroupCount;\r
- this.mapping = this.machineFactory.Mapping;\r
- }\r
- }\r
-\r
- private Regex (SerializationInfo info, StreamingContext context) :\r
- this (info.GetString ("pattern"), \r
- (RegexOptions) info.GetValue ("options", typeof (RegexOptions))) {\r
- }\r
-\r
- // fixes public API signature\r
- ~Regex ()\r
- {\r
- }\r
-\r
- // public instance properties\r
- \r
- public RegexOptions Options {\r
- get { return roptions; }\r
- }\r
-\r
- public bool RightToLeft {\r
- get { return (roptions & RegexOptions.RightToLeft) != 0; }\r
- }\r
-\r
- // public instance methods\r
- \r
- public string[] GetGroupNames () {\r
- string[] names = new string[mapping.Count];\r
- mapping.Keys.CopyTo (names, 0);\r
-\r
- return names;\r
- }\r
-\r
- public int[] GetGroupNumbers () {\r
- int[] numbers = new int[mapping.Count];\r
- mapping.Values.CopyTo (numbers, 0);\r
-\r
- return numbers;\r
- }\r
-\r
- public string GroupNameFromNumber (int i) {\r
- if (i > group_count)\r
- return "";\r
- \r
- foreach (string name in mapping.Keys) {\r
- if ((int)mapping[name] == i)\r
- return name;\r
- }\r
-\r
- return "";\r
- }\r
-\r
- public int GroupNumberFromName (string name) {\r
- if (mapping.Contains (name))\r
- return (int)mapping[name];\r
-\r
- return -1;\r
- }\r
-\r
- // match methods\r
- \r
- public bool IsMatch (string input) {\r
- if (RightToLeft)\r
- return IsMatch (input, input.Length);\r
- else\r
- return IsMatch (input, 0);\r
- }\r
-\r
- public bool IsMatch (string input, int startat) {\r
- return Match (input, startat).Success;\r
- }\r
-\r
- public Match Match (string input) {\r
- if (RightToLeft)\r
- return Match (input, input.Length);\r
- else\r
- return Match (input, 0);\r
- }\r
-\r
- public Match Match (string input, int startat) {\r
- \r
- return CreateMachine ().Scan (this, input, startat, input.Length);\r
- }\r
-\r
- public Match Match (string input, int startat, int length) {\r
- \r
- return CreateMachine ().Scan (this, input, startat, startat + length);\r
- }\r
-\r
- public MatchCollection Matches (string input) {\r
- if (RightToLeft)\r
- return Matches (input, input.Length);\r
- else\r
- return Matches (input, 0);\r
- }\r
-\r
- public MatchCollection Matches (string input, int startat) {\r
- Match m = Match (input, startat);\r
- return new MatchCollection (m);\r
- }\r
-\r
- // replace methods\r
-\r
- public string Replace (string input, MatchEvaluator evaluator) {\r
- if (RightToLeft) \r
- return Replace (input, evaluator, Int32.MaxValue, input.Length);\r
- else\r
- return Replace (input, evaluator, Int32.MaxValue, 0);\r
- }\r
-\r
- public string Replace (string input, MatchEvaluator evaluator, int count) {\r
- if (RightToLeft)\r
- return Replace (input, evaluator, count, input.Length);\r
- else\r
- return Replace (input, evaluator, count, 0);\r
- }\r
-\r
- class Adapter\r
- {\r
- MatchEvaluator ev;\r
- public Adapter (MatchEvaluator ev) { this.ev = ev; }\r
- public void Evaluate (Match m, StringBuilder sb) { sb.Append (ev (m)); }\r
- }\r
-\r
- public string Replace (string input, MatchEvaluator evaluator, int count, int startat)\r
- {\r
- Adapter a = new Adapter (evaluator);\r
- return Replace (input, new MatchAppendEvaluator (a.Evaluate), count, startat);\r
- }\r
-\r
- string Replace (string input, MatchAppendEvaluator evaluator, int count, int startat)\r
- {\r
- StringBuilder result = new StringBuilder ();\r
- int ptr = startat;\r
- int counter = count;\r
-\r
- result.Append (input, 0, ptr);\r
-\r
- Match m = Match (input, startat);\r
- while (m.Success) {\r
- if (count != -1)\r
- if(counter -- <= 0)\r
- break;\r
- result.Append (input, ptr, m.Index - ptr);\r
- evaluator (m, result);\r
-\r
- ptr = m.Index + m.Length;\r
- m = m.NextMatch ();\r
- }\r
- \r
- if (ptr == 0)\r
- return input;\r
- \r
- result.Append (input, ptr, input.Length - ptr);\r
-\r
- return result.ToString ();\r
- }\r
-\r
- public string Replace (string input, string replacement) {\r
- if (RightToLeft)\r
- return Replace (input, replacement, Int32.MaxValue, input.Length);\r
- else\r
- return Replace (input, replacement, Int32.MaxValue, 0);\r
- }\r
-\r
- public string Replace (string input, string replacement, int count) {\r
- if (RightToLeft) \r
- return Replace (input, replacement, count, input.Length);\r
- else \r
- return Replace (input, replacement, count, 0);\r
- }\r
-\r
- public string Replace (string input, string replacement, int count, int startat) {\r
- ReplacementEvaluator ev = new ReplacementEvaluator (this, replacement);\r
- return Replace (input, new MatchAppendEvaluator (ev.EvaluateAppend), count, startat);\r
- }\r
-\r
- // split methods\r
-\r
- public string[] Split (string input) {\r
- if (RightToLeft) \r
- return Split (input, Int32.MaxValue, input.Length);\r
- else\r
- return Split (input, Int32.MaxValue, 0);\r
- }\r
-\r
- public string[] Split (string input, int count) {\r
- if (RightToLeft) \r
- return Split (input, count, input.Length);\r
- else\r
- return Split (input, count, 0);\r
- }\r
-\r
- public string[] Split (string input, int count, int startat) {\r
- ArrayList splits = new ArrayList ();\r
- if (count == 0)\r
- count = Int32.MaxValue;\r
-\r
- int ptr = startat;\r
- Match m = null;\r
- while (--count > 0) {\r
- if (m != null)\r
- m = m.NextMatch ();\r
- else\r
- m = Match (input, ptr);\r
-\r
- if (!m.Success)\r
- break;\r
- \r
- if (RightToLeft)\r
- splits.Add (input.Substring (m.Index + m.Length , ptr - m.Index - m.Length ));\r
- else\r
- splits.Add (input.Substring (ptr, m.Index - ptr));\r
- \r
- int gcount = m.Groups.Count;\r
- for (int gindex = 1; gindex < gcount; gindex++) {\r
- Group grp = m.Groups [gindex];\r
- splits.Add (input.Substring (grp.Index, grp.Length));\r
- }\r
-\r
- if (RightToLeft)\r
- ptr = m.Index; \r
- else\r
- ptr = m.Index + m.Length;\r
- \r
- }\r
-\r
- if (RightToLeft) {\r
- if ( ptr >= 0) {\r
- splits.Add (input.Substring(0, ptr));\r
- }\r
- } \r
- else {\r
- if (ptr <= input.Length) {\r
- splits.Add (input.Substring (ptr));\r
- }\r
- \r
- }\r
-\r
- return (string []) splits.ToArray (typeof (string));\r
- }\r
-\r
- // MS undocummented method\r
- [MonoTODO]\r
- protected void InitializeReferences() {\r
- throw new NotImplementedException ();\r
- }\r
-\r
- [MonoTODO]\r
- protected bool UseOptionC(){\r
- throw new NotImplementedException ();\r
- }\r
-\r
- [MonoTODO]\r
- protected bool UseOptionR(){\r
- throw new NotImplementedException ();\r
- }\r
-\r
- // object methods\r
- \r
- public override string ToString () {\r
- return pattern;\r
- }\r
-\r
- // ISerializable interface\r
- void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context) {\r
- info.AddValue ("pattern", this.ToString (), typeof (string));\r
- info.AddValue ("options", this.Options, typeof (RegexOptions));\r
- }\r
-\r
- // internal\r
-\r
- internal int GroupCount {\r
- get { return group_count; }\r
- }\r
-\r
- // private\r
-\r
- private IMachine CreateMachine () {\r
- return machineFactory.NewInstance ();\r
- }\r
-\r
- private IMachineFactory machineFactory;\r
- private IDictionary mapping;\r
- private int group_count;\r
-\r
- \r
- // protected members\r
-\r
- protected internal string pattern;\r
- protected internal RegexOptions roptions;\r
- \r
- // MS undocumented members\r
- [MonoTODO]\r
- protected internal System.Collections.Hashtable capnames;\r
- [MonoTODO]\r
- protected internal System.Collections.Hashtable caps;\r
- [MonoTODO]\r
- protected internal int capsize;\r
- [MonoTODO]\r
- protected internal string[] capslist;\r
- [MonoTODO]\r
- protected internal RegexRunnerFactory factory;\r
- }\r
-\r
- [Serializable]\r
- public class RegexCompilationInfo {\r
- public RegexCompilationInfo (string pattern, RegexOptions options, string name, string nspace, bool isPublic)\r
- {\r
- this.pattern = pattern;\r
- this.options = options;\r
- this.name = name;\r
- this.nspace = nspace;\r
- this.isPublic = isPublic;\r
- }\r
-\r
- public bool IsPublic {\r
- get { return isPublic; }\r
- set { isPublic = value; }\r
- }\r
-\r
- public string Name {\r
- get { return name; }\r
- set { name = value; }\r
- }\r
-\r
- public string Namespace {\r
- get { return nspace; }\r
- set { nspace = value; }\r
- }\r
-\r
- public RegexOptions Options {\r
- get { return options; }\r
- set { options = value; }\r
- }\r
-\r
- public string Pattern {\r
- get { return pattern; }\r
- set { pattern = value; }\r
- }\r
-\r
- // private\r
-\r
- private string pattern, name, nspace;\r
- private RegexOptions options;\r
- private bool isPublic;\r
- }\r
-}\r