正则表达式能不能实现把一个符合一定规范的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中有没有什么辅助工具?
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中有没有什么辅助工具?
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.
勾選 Use
下拉框中選擇: 正則表達式
foreach无法实现
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;
谢谢你的这个答案,基本上是可以的。不过我不太明白(?isn)是什么意思 ?
(?s) 单行模式,表示小数点可以匹配任意字符
(?n) 只捕获命名捕获组,也就是把普通的非命名捕获组解释为非捕获组参考
.NET正则基础之——.NET正则匹配模式