3 // namespace: System.Text.RegularExpressions
\r
6 // author: Dan Lewis (dlewis@gmx.co.uk)
\r
11 namespace System.Text.RegularExpressions {
\r
14 public class Capture {
\r
16 get { return index; }
\r
20 get { return length; }
\r
23 public string Value {
\r
26 return text.Substring (index, length);
32 public override string ToString () {
\r
38 internal Capture (string text) : this (text, 0, 0) { }
\r
40 internal Capture (string text, int index, int length) {
\r
43 this.length = length;
\r
46 internal string Text {
\r
47 get { return text; }
\r
52 internal int index, length;
\r
53 internal string text;
\r
57 public class Group : Capture {
\r
58 public static Group Synchronized (Group inner) {
\r
59 return inner; // is this enough?
\r
62 public CaptureCollection Captures {
\r
63 get { return captures; }
\r
66 public bool Success {
\r
67 get { return success; }
\r
72 internal Group (string text, int[] caps) : base (text) {
\r
73 this.captures = new CaptureCollection ();
\r
75 if (caps == null || caps.Length == 0) {
\r
76 this.success = false;
\r
80 this.success = true;
\r
81 this.index = caps[0];
\r
82 this.length = caps[1];
\r
83 captures.Add (this);
\r
84 for (int i = 2; i < caps.Length; i += 2)
\r
85 captures.Add (new Capture (text, caps[i], caps[i + 1]));
\r
86 captures.Reverse ();
\r
89 internal Group (): base ("")
\r
91 captures = new CaptureCollection ();
\r
94 private bool success;
\r
95 private CaptureCollection captures;
\r
99 public class Match : Group {
\r
100 public static Match Empty {
\r
101 get { return empty; }
\r
104 public static Match Synchronized (Match inner) {
\r
105 return inner; // FIXME need to sync on machine access
\r
108 public virtual GroupCollection Groups {
\r
109 get { return groups; }
\r
112 public Match NextMatch () {
\r
116 int scan_ptr = regex.RightToLeft ? Index : Index + Length;
\r
118 // next match after an empty match: make sure scan ptr makes progress
\r
121 scan_ptr += regex.RightToLeft ? -1 : +1;
\r
123 return machine.Scan (regex, Text, scan_ptr, text_length);
\r
126 public virtual string Result (string replacement) {
\r
127 return ReplacementEvaluator.Evaluate (replacement, this);
\r
132 internal Match () : base (null, null) {
\r
134 this.machine = null;
\r
135 this.text_length = 0;
\r
136 this.groups = new GroupCollection ();
\r
141 internal Match (Regex regex, IMachine machine, string text, int text_length, int[][] grps) :
\r
142 base (text, grps[0])
\r
144 this.regex = regex;
\r
145 this.machine = machine;
\r
146 this.text_length = text_length;
\r
148 this.groups = new GroupCollection ();
\r
150 for (int i = 1; i < grps.Length; ++ i)
\r
151 groups.Add (new Group (text, grps[i]));
\r
154 internal Regex Regex {
\r
155 get { return regex; }
\r
160 private Regex regex;
\r
161 private IMachine machine;
\r
162 private int text_length;
\r
163 private GroupCollection groups;
\r
165 private static Match empty = new Match ();
\r