Как RegEx заменить регионы в коллекцию - PullRequest
0 голосов
/ 17 октября 2010

У меня есть строка, из которой я хочу извлечь текст между тегами комментариев, манипулировать им и заменить его обратно Вот с чем я пытаюсь работать:

...
<!--RegionStart url="http://domain1.com"-->
    some text here
<!--RegionFinish-->
...
<!--RegionStart url="http://domain2.com"-->
    some text there
<!--RegionFinish-->
...
<!--RegionStart url="http://domain3.com"-->
    some text anywhere
<!--RegionFinish-->
...

Я хотел бы получить коллекцию текста между тегами комментариев и перечислить их следующим образом:

foreach (string item in collection)
{
    string newText = item.Replace("some", "all") + Custom(url);
    //put text back somehow
}

Я пытаюсь закончить с этим:

...
<!--RegionStart url="http://domain1.com"-->
    all text here domain1.com
<!--RegionFinish-->
...
<!--RegionStart url="http://domain2.com"-->
    all text there domain2.com
<!--RegionFinish-->
...
<!--RegionStart url="http://domain3.com"-->
    all text anywhere domain3.com
<!--RegionFinish-->
...

Как я могу это сделать?

1 Ответ

2 голосов
/ 17 октября 2010

Главное, что нужно понять, это:

  1. Требуется не жадное сопоставление регулярных выражений (*? И т. Д.)
  2. Возможно, проще всего использовать Replace с пользовательским MatchEvaluator.

Это должно сработать:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        outputTextBox.Text = "";
        Regex regex = new Regex("(<!--RegionStart url=\"http://(.*?)\"-->)(.*?)(<!--RegionFinish-->)", RegexOptions.Singleline);

        string copy = inputTextBox.Text;
        MatchCollection coll = regex.Matches(inputTextBox.Text);                
        outputTextBox.Text = regex.Replace(copy, new MatchEvaluator(Replace));
    }

    public string Replace(Match m)        
    {
        // Format the text you want to get back:
        return String.Format("{0}{1} {2}{3}", 
            m.Groups[1].ToString() + Environment.NewLine, 
            m.Groups[3].ToString().Replace("some", "all").Trim(),
            m.Groups[2].ToString().Trim() + Environment.NewLine, 
            m.Groups[4].ToString());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...