Использование делегатов в рег выражениях

  • Автор темы NikSoft
  • Дата начала
N

NikSoft

Часто бывает необходимо заменить вхождение нескольких регулярных выражений в данном тексте.
Использование делегата решает эту задачу, задействуя только один обьект типа Regex, как, например, в следующем коде.
Код:
using System;
using System.Text.RegularExpressions;

namespace DelegatesInRegExprs
{
class Program
{
static void Main(string[] args)
{
string source = "abcd'fd	 sm;'			 cxz ,jij";

ColorConsole.WriteLine(ConsoleColor.Yellow, String.Format("source: {0}", source));
string target = RegExprs.replaceApos.Replace(source,
new MatchEvaluator(CaptureText));
ColorConsole.WriteLine(ConsoleColor.Yellow, String.Format("target: {0}", target));
Console.ReadLine();
}

static string CaptureText(Match m)
{
string result = m.ToString(); 

if (String.Compare(result.Substring(0, 1), "'") == 0)
{
result = "''";
}
if (String.Compare(result.Substring(0, 1), " ") == 0)
{
result = " ";
}
return result;
}	
}
}
Здесь необходимо заменить в строке source одиночный апостроф на двойной и удалить лишние пробелы.
Делегат MatchEvaluator вызывает функцию CaptureText, когда найдено вхождение регулярного выражения. Тексты классов RegExprs и ColorConsole приводятся ниже.
Код:
class RegExprs
{
// ...
public static Regex replaceApos = new Regex("('|\x20+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
// ...
}

public static class ColorConsole
{
public static void WriteLine(ConsoleColor color, string textToWrite)
{
Console.ForegroundColor = color;
Console.WriteLine(textToWrite);
Console.ResetColor();
}
}
Дополнительную информацию по рег выражениям можно найти здесь

https://codeby.net/threads/13187.html
https://codeby.net/threads/13394.html
 
P

Pasha

Хм. Почему
Код:
new Regex("('|\x20+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
...
string result = m.ToString();
...
if (String.Compare(result.Substring(0, 1), "'") == 0)
...
if (String.Compare(result.Substring(0, 1), " ") == 0)
а не
Код:
new Regex("'|\x20+", RegexOptions.Compiled)
...
string result = m.Value;
...
if (result == "'")
...
if (result.StartsWith(" "))
?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!