Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
RegexReplacement.cs
Go to the documentation of this file.
4
6
7internal sealed class RegexReplacement
8{
9 private struct FourStackStrings
10 {
11 public string Item1;
12
13 public string Item2;
14
15 public string Item3;
16
17 public string Item4;
18 }
19
20 private readonly string[] _strings;
21
22 private readonly int[] _rules;
23
24 public string Pattern { get; }
25
27 {
28 if (concat.Type != 25)
29 {
31 }
38 int num = concat.ChildCount();
39 for (int i = 0; i < num; i++)
40 {
41 RegexNode regexNode = concat.Child(i);
42 switch (regexNode.Type)
43 {
44 case 12:
45 valueStringBuilder.Append(regexNode.Str);
46 break;
47 case 9:
49 break;
50 case 13:
51 {
52 if (valueStringBuilder.Length > 0)
53 {
55 valueListBuilder.Append(valueStringBuilder.ToString());
57 }
58 int num2 = regexNode.M;
59 if (_caps != null && num2 >= 0)
60 {
61 num2 = (int)_caps[num2];
62 }
63 valueListBuilder2.Append(-5 - num2);
64 break;
65 }
66 default:
68 }
69 }
70 if (valueStringBuilder.Length > 0)
71 {
73 valueListBuilder.Append(valueStringBuilder.ToString());
74 }
75 Pattern = rep;
76 _strings = valueListBuilder.AsSpan().ToArray();
77 _rules = valueListBuilder2.AsSpan().ToArray();
78 valueListBuilder2.Dispose();
79 }
80
82 {
83 if (!replRef.TryGetTarget(out var target) || !target.Pattern.Equals(replacement))
84 {
85 target = RegexParser.ParseReplacement(replacement, roptions, caps, capsize, capnames);
86 replRef.SetTarget(target);
87 }
88 return target;
89 }
90
92 {
93 int[] rules = _rules;
94 foreach (int num in rules)
95 {
97 if (num >= 0)
98 {
99 readOnlyMemory = _strings[num].AsMemory();
100 }
101 else
102 {
103 ReadOnlyMemory<char> readOnlyMemory2 = ((num >= -4) ? ((-5 - num) switch
104 {
105 -1 => match.GetLeftSubstring(),
106 -2 => match.GetRightSubstring(),
107 -3 => match.LastGroupToStringImpl(),
108 -4 => match.Text.AsMemory(),
109 _ => default(ReadOnlyMemory<char>),
110 }) : match.GroupToStringImpl(-5 - num));
112 }
114 if (segment.Length != 0)
115 {
117 }
118 }
119 }
120
122 {
123 for (int num = _rules.Length - 1; num >= 0; num--)
124 {
125 int num2 = _rules[num];
127 if (num2 >= 0)
128 {
129 readOnlyMemory = _strings[num2].AsMemory();
130 }
131 else
132 {
133 ReadOnlyMemory<char> readOnlyMemory2 = ((num2 >= -4) ? ((-5 - num2) switch
134 {
135 -1 => match.GetLeftSubstring(),
136 -2 => match.GetRightSubstring(),
137 -3 => match.LastGroupToStringImpl(),
138 -4 => match.Text.AsMemory(),
139 _ => default(ReadOnlyMemory<char>),
140 }) : match.GroupToStringImpl(-5 - num2));
142 }
144 if (segment.Length != 0)
145 {
147 }
148 }
149 }
150
151 public string Replace(Regex regex, string input, int count, int startat)
152 {
153 if (count < -1)
154 {
156 }
157 if ((uint)startat > (uint)input.Length)
158 {
160 }
161 if (count == 0)
162 {
163 return input;
164 }
166 if (!regex.RightToLeft)
167 {
169 {
170 state.segments.Add(state.inputMemory.Slice(state.prevat, match.Index - state.prevat));
171 state.prevat = match.Index + match.Length;
172 state.thisRef.ReplacementImpl(ref state.segments, match);
173 return --state.count != 0;
174 }, reuseMatchObject: true);
175 if (state2.Item2.Count == 0)
176 {
177 return input;
178 }
179 state2.Item2.Add(state2.Item3.Slice(state2.Item4, input.Length - state2.Item4));
180 }
181 else
182 {
183 state2.Item4 = input.Length;
185 {
186 state.segments.Add(state.inputMemory.Slice(match.Index + match.Length, state.prevat - match.Index - match.Length));
187 state.prevat = match.Index;
188 state.thisRef.ReplacementImplRTL(ref state.segments, match);
189 return --state.count != 0;
190 }, reuseMatchObject: true);
191 if (state2.Item2.Count == 0)
192 {
193 return input;
194 }
195 state2.Item2.Add(state2.Item3.Slice(0, state2.Item4));
196 state2.Item2.AsSpan().Reverse();
197 }
198 return state2.Item2.ToString();
199 }
200}
void Add(TKey key, TValue value)
string Replace(Regex regex, string input, int count, int startat)
RegexReplacement(string rep, RegexNode concat, Hashtable _caps)
void ReplacementImplRTL(ref SegmentStringBuilder segments, Match match)
static RegexReplacement GetOrCreate(WeakReference< RegexReplacement > replRef, string replacement, Hashtable caps, int capsize, Hashtable capnames, RegexOptions roptions)
void ReplacementImpl(ref SegmentStringBuilder segments, Match match)
static Exception CreateArgumentException(ExceptionResource resource)
Definition ThrowHelper.cs:8
static void ThrowArgumentOutOfRangeException(ExceptionArgument arg)
static RegexReplacement ParseReplacement(string pattern, RegexOptions options, Hashtable caps, int capsize, Hashtable capnames)
static SegmentStringBuilder Create()