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
24 get { return text.Substring (index, length); }
\r
27 public override string ToString () {
\r
33 internal Capture (string text) : this (text, 0, 0) { }
\r
35 internal Capture (string text, int index, int length) {
\r
38 this.length = length;
\r
41 internal string Text {
\r
42 get { return text; }
\r
47 internal int index, length;
\r
48 internal string text;
\r
52 public class Group : Capture {
\r
53 public static Group Synchronized (Group inner) {
\r
54 return inner; // is this enough?
\r
57 public CaptureCollection Captures {
\r
58 get { return captures; }
\r
61 public bool Success {
\r
62 get { return success; }
\r
67 internal Group (string text, int[] caps) : base (text) {
\r
68 this.captures = new CaptureCollection ();
\r
70 if (caps == null || caps.Length == 0) {
\r
71 this.success = false;
\r
75 this.success = true;
\r
76 this.index = caps[0];
\r
77 this.length = caps[1];
\r
78 captures.Add (this);
\r
79 for (int i = 2; i < caps.Length; i += 2)
\r
80 captures.Add (new Capture (text, caps[i], caps[i + 1]));
\r
81 captures.Reverse ();
\r
84 private bool success;
\r
85 private CaptureCollection captures;
\r
89 public class Match : Group {
\r
90 public static Match Empty {
\r
91 get { return empty; }
\r
94 public static Match Synchronized (Match inner) {
\r
95 return inner; // FIXME need to sync on machine access
\r
98 public virtual GroupCollection Groups {
\r
99 get { return groups; }
\r
102 public Match NextMatch () {
\r
106 int scan_ptr = regex.RightToLeft ? Index : Index + Length;
\r
108 // next match after an empty match: make sure scan ptr makes progress
\r
111 scan_ptr += regex.RightToLeft ? -1 : +1;
\r
113 return machine.Scan (regex, Text, scan_ptr, text_length);
\r
116 public virtual string Result (string replacement) {
\r
117 return ReplacementEvaluator.Evaluate (replacement, this);
\r
122 internal Match () : base (null, null) {
\r
124 this.machine = null;
\r
125 this.text_length = 0;
\r
126 this.groups = new GroupCollection ();
\r
131 internal Match (Regex regex, IMachine machine, string text, int text_length, int[][] grps) :
\r
132 base (text, grps[0])
\r
134 this.regex = regex;
\r
135 this.machine = machine;
\r
136 this.text_length = text_length;
\r
138 this.groups = new GroupCollection ();
\r
140 for (int i = 1; i < grps.Length; ++ i)
\r
141 groups.Add (new Group (text, grps[i]));
\r
144 internal Regex Regex {
\r
145 get { return regex; }
\r
150 private Regex regex;
\r
151 private IMachine machine;
\r
152 private int text_length;
\r
153 private GroupCollection groups;
\r
155 private static Match empty = new Match ();
\r