重复C#正则表达式替换

时间:2017-02-22 12:26:29

标签: c# .net regex

我想创建一个小工具来转换一些代码。

大部分都可以通过Regex完成,所以我不需要实际的解析器。

但重复模式存在问题。 下面是一个简化的示例:

var nl = Environment.NewLine;
var temp = 
@"Other things
End
End
Other things";

temp = Regex.Replace(temp, @"(\r\nEnd\r\n)+",@"" + nl + "}" + nl + "");

这将返回

Other things
}
End
Other things

所以第二个End没有被替换。 (除非我执行两次相同的Regex.Replace)

知道如何解决这个问题吗?

祝你好运

1 个答案:

答案 0 :(得分:3)

这是因为匹配不能重叠。

Other things\r\n
End\r\n
End\r\n
Other things\r\n

匹配为

Other things***From Here***\r\n
End\r\n***To Here***
End\r\n
Other things

正则表达式与第二个\r\nEnd\r\n不匹配,因为已经捕获了带前缀的\r\n

尝试:

temp = Regex.Replace(temp, @"(?<=\r\n)End(?=\r\n)+", "}");

使用非捕获分组(?<=)(?=)可以解决问题(但请注意,如果不捕获,则无法替换(?<=)中匹配的内容(?=),因此替换文字"}")的差异