能不能实现用正则表达式替换for为foreach

stg609 2010-06-26 04:55:39
正则表达式能不能实现把一个符合一定规范的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中有没有什么辅助工具?
...全文
199 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-06-28
  • 打赏
  • 举报
回复
有答案了尽快结贴。
zyrr159487 2010-06-28
  • 打赏
  • 举报
回复
路过,接分
angel6709 2010-06-28
  • 打赏
  • 举报
回复
给点分
stg609 2010-06-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lxcnn 的回复:]

try...

C# code
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>[……
[/Quote]

谢谢你的这个答案,基本上是可以的。不过我不太明白(?isn)是什么意思 ?
-过客- 2010-06-27
  • 打赏
  • 举报
回复
(?i) 忽略大小写
(?s) 单行模式,表示小数点可以匹配任意字符
(?n) 只捕获命名捕获组,也就是把普通的非命名捕获组解释为非捕获组

参考
.NET正则基础之——.NET正则匹配模式
  • 打赏
  • 举报
回复
如果你实实在在地去测试,你会发现有许多字符串操作,包括用很简练的Linq处理字符串,比正则表达式快,而且程序更容易读懂。

更容易读懂,这很重要!
-过客- 2010-06-26
  • 打赏
  • 举报
回复
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;
stg609 2010-06-26
  • 打赏
  • 举报
回复
希望赐教。代码就假设很有规律吧:for中都是从基数0开始顺序遍历每个成员,并且对集合元素的操作不包括赋值操作。
波导终结者 2010-06-26
  • 打赏
  • 举报
回复
这个很难,要自动识别并替换数据类型、集合类型、集合对象等,代码需要很有规律。如果代码有规律的话,不妨自己写一个方法来做。
stg609 2010-06-26
  • 打赏
  • 举报
回复
我想楼上的可能误解了我的意思吧
zzz9413 2010-06-26
  • 打赏
  • 举报
回复
对于移动,添加删除等操作
foreach无法实现
stg609 2010-06-26
  • 打赏
  • 举报
回复
可是这个只能得到匹配的for循环,我的问题是如果进行替换?在我的文件中,可能会出现多个符合一定规范的for循环,我希望通过正则表达式一次性全部替换。也就是说for循环中可能出现各种其他语句,比如可能出现Console.Write(DateTime.Now)等其他语句。这个用我所给的正则表达式是照样可以匹配出来的,可是问题就是如何替换?
teerhu 2010-06-26
  • 打赏
  • 举报
回复
查找替换
勾選 Use
下拉框中選擇: 正則表達式
stg609 2010-06-26
  • 打赏
  • 举报
回复
查找替换能够实现我的需求吗?
hhc123 2010-06-26
  • 打赏
  • 举报
回复
vs ->编辑->查找替换.............................
stg609 2010-06-26
  • 打赏
  • 举报
回复
我写了一个获取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.

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧