2010-10-17 1 views
0

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

... 
<!--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--> 
... 

Как это сделать?

ответ

2

Главное понять здесь

  1. Non-жадные соответствия регулярных выражений (*? И т.д.) требуется
  2. Это, вероятно, самый простой в использовании Заменить пользовательский 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()); 
    } 
} 
+0

Brilliant !!!!!! – TruMan1

Смежные вопросы