如何RegEx将区域替换为集合

时间:2010-10-17 02:06:54

标签: c# .net regex string

我有一个字符串,我想在注释标记之间提取文本,操纵它并将其替换回来。以下是我正在尝试使用的内容:

...
<!--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 个答案:

答案 0 :(得分:2)

这里理解的主要是

  1. 需要非贪婪的正则表达式匹配(*?等)
  2. 使用自定义MatchEvaluator替换可能最简单。
  3. 这应该可以解决问题:

    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());
        }
    }