static private Replace ( MatchEvaluator evaluator, |
||
evaluator | MatchEvaluator | |
regex | ||
input | string | |
count | int | |
startat | int | |
리턴 | string |
internal static string Replace(MatchEvaluator evaluator, Regex regex,
string input, int count, int startat)
{
if (evaluator == null)
throw new ArgumentNullException(nameof(evaluator));
if (count < -1)
throw new ArgumentOutOfRangeException(nameof(count), SR.CountTooSmall);
if (startat < 0 || startat > input.Length)
throw new ArgumentOutOfRangeException(nameof(startat), SR.BeginIndexNotNegative);
if (count == 0)
return input;
Match match = regex.Match(input, startat);
if (!match.Success)
{
return input;
}
else
{
StringBuilder sb = StringBuilderCache.Acquire();
if (!regex.RightToLeft)
{
int prevat = 0;
do
{
if (match.Index != prevat)
sb.Append(input, prevat, match.Index - prevat);
prevat = match.Index + match.Length;
sb.Append(evaluator(match));
if (--count == 0)
break;
match = match.NextMatch();
} while (match.Success);
if (prevat < input.Length)
sb.Append(input, prevat, input.Length - prevat);
}
else
{
List<string> al = new List<string>();
int prevat = input.Length;
do
{
if (match.Index + match.Length != prevat)
al.Add(input.Substring(match.Index + match.Length, prevat - match.Index - match.Length));
prevat = match.Index;
al.Add(evaluator(match));
if (--count == 0)
break;
match = match.NextMatch();
} while (match.Success);
if (prevat > 0)
sb.Append(input, 0, prevat);
for (int i = al.Count - 1; i >= 0; i--)
{
sb.Append(al[i]);
}
}
return StringBuilderCache.GetStringAndRelease(sb);
}
}
RegexReplacement::Replace ( |
/// <summary> /// Replaces all occurrences of the previously defined pattern with the recent /// replacement pattern, starting at the character position /// <paramref name="startat"/>. /// </summary> public string Replace(string input, MatchEvaluator evaluator, int count, int startat) { if (input == null) throw new ArgumentNullException(nameof(input)); return RegexReplacement.Replace(evaluator, this, input, count, startat); }