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

Тема в разделе ".NET", создана пользователем NikSoft, 30 апр 2007.

  1. NikSoft

    NikSoft Гость

    Часто бывает необходимо заменить вхождение нескольких регулярных выражений в данном тексте.
    Использование делегата решает эту задачу, задействуя только один обьект типа Regex, как, например, в следующем коде.
    Код (Text):
    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 приводятся ниже.
    Код (Text):
    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();
    }
    }
    Дополнительную информацию по рег выражениям можно найти здесь
    http://regexlib.com/Default.aspx
    http://codeby.net/forum/threads/13187.html
    http://codeby.net/forum/threads/13394.html
     
  2. Pasha

    Pasha Гость

    Хм. Почему
    Код (Text):
    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)
    а не
    Код (Text):
    new Regex("'|\x20+", RegexOptions.Compiled)
    ...
    string result = m.Value;
    ...
    if (result == "'")
    ...
    if (result.StartsWith(" "))
    ?
     
Загрузка...

Поделиться этой страницей