我想创建一个小工具来转换一些代码。
大部分都可以通过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)
知道如何解决这个问题吗?
祝你好运
答案 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)+", "}");
使用非捕获分组(?<=)
和(?=)
可以解决问题(但请注意,如果不捕获,则无法替换(?<=)
中匹配的内容(?=)
,因此替换文字"}"
)的差异