正则表达式能不能实现把一个符合一定规范的for循环替换成foreach如:
List<int> li = new List<int>();
for(int i=0;i<li.Count;i++)
{
    Console.WriteLine(li[i]);
}替换成:
List<int> li = new List<int>();
foreach(var item in li)
{
    Console.WriteLine(item);
}如果正则表达式实现不了,有没有其它方式来替换?在VS中有没有什么辅助工具?

解决方案 »

  1.   

    我写了一个获取for循环的正则,但是不知道如何替换。
    for\s*\([a-zA-Z]+\s*([a-zA-Z]+)\s*=\s*0\s*\;\s*[a-zA-Z]+\s*\<\s*([a-zA-Z])\.[a-zA-Z]+\s*\;\s*[a-zA-Z]+\+\+\)\s*\r\n\s*\{[^\}]+\}通过这个表达式可以匹配出上述的for循环,并且可以得到2个分组,一个分组是变量i,另一个分组是变量li.
      

  2.   

    vs ->编辑->查找替换.............................
      

  3.   

    查找替换
    勾選 Use
    下拉框中選擇: 正則表達式
      

  4.   

    可是这个只能得到匹配的for循环,我的问题是如果进行替换?在我的文件中,可能会出现多个符合一定规范的for循环,我希望通过正则表达式一次性全部替换。也就是说for循环中可能出现各种其他语句,比如可能出现Console.Write(DateTime.Now)等其他语句。这个用我所给的正则表达式是照样可以匹配出来的,可是问题就是如何替换?
      

  5.   

    对于移动,添加删除等操作
    foreach无法实现
      

  6.   

    希望赐教。代码就假设很有规律吧:for中都是从基数0开始顺序遍历每个成员,并且对集合元素的操作不包括赋值操作。
      

  7.   

    try...string test = @"List<int> li = new List<int>();
    for(int i=0;i<li.Count;i++)
    {
      Console.WriteLine(li[i]);
    }";
    Regex reg = new Regex(@"(?isn)(?<list>List<(?<type>[^>]+)>\s+(?<coll>[^\s=]+)\s*=((?!for).)*)for\s*\([^)]+\)\s*(?<loop>\{[^}]*\})");
    string result = reg.Replace(test, delegate(Match m) { return m.Groups["list"].Value + "foreach(" + m.Groups["type"].Value + " item in " 
        + m.Groups["coll"].Value + ")\n" + m.Groups["loop"].Value.Replace(m.Groups["coll"].Value + "[i]" , "item"); });
    richTextBox2.Text = result;只适用于特定的格式
    可以得到类型,就没有用“var”,如果想使用“var”,替换一下
    string test = @"List<int> li = new List<int>();
    for(int i=0;i<li.Count;i++)
    {
      Console.WriteLine(li[i]);
    }";
    Regex reg = new Regex(@"(?isn)(?<list>List<(?<type>[^>]+)>\s+(?<coll>[^\s=]+)\s*=((?!for).)*)for\s*\([^)]+\)\s*(?<loop>\{[^}]*\})");
    string result = reg.Replace(test, delegate(Match m) { return m.Groups["list"].Value + "foreach(var item in " 
        + m.Groups["coll"].Value + ")\n" + m.Groups["loop"].Value.Replace(m.Groups["coll"].Value + "[i]" , "item"); });
    richTextBox2.Text = result;
      

  8.   

    如果你实实在在地去测试,你会发现有许多字符串操作,包括用很简练的Linq处理字符串,比正则表达式快,而且程序更容易读懂。更容易读懂,这很重要!
      

  9.   


    谢谢你的这个答案,基本上是可以的。不过我不太明白(?isn)是什么意思 ?
      

  10.   

    (?i)  忽略大小写
    (?s)  单行模式,表示小数点可以匹配任意字符
    (?n)  只捕获命名捕获组,也就是把普通的非命名捕获组解释为非捕获组参考
    .NET正则基础之——.NET正则匹配模式