查找并替换RegEx问题

由于我在其他问题上对SO的所有帮助很大,我开始掌握RegEx。 但我仍然对这个感到厌烦:

我的代码是:

StreamReader reader = new StreamReader(fDialog.FileName.ToString()); string content = reader.ReadToEnd(); reader.Close(); 

我正在阅读文本文件,我想搜索此文本并进行更改(X和Y值始终在我的文本文件中互相跟随):

X17.8Y-1。

但是这个文本也可以是X16.1Y2.3 (在X和Y之后值总是不同的)

我想把它改成这个

X17.8Y-1.G54
要么
X(值)Y(值)G54

我的RegEx声明如下,但它无效。

 content = Regex.Replace(content, @"(X(?:\d*\.)?\d+)*(Y(?:\d*\.)?\d+)", "$1$2G54"); 

有人可以为我修改它,以便它可以工作,并将搜索X(通配符)Y(通配符)并将其替换为X(值)Y(值)G54?

您需要的正则表达式是:

 X[-\d.]+Y[-\d.]+ 

以下是如何在C#中使用它:

 string content = "foo X17.8Y-1. bar"; content = Regex.Replace(content, @"X[-\d.]+Y[-\d.]+", "$0G54"); Console.WriteLine(content); 

输出:

 foo X17.8Y-1.G54吧

在文本文件中的“X(值)Y(值)”之后会出现什么? 空间? 换行? 另一个“X(值)Y(值)”值对?

我在正则表达式中使用快捷方式不是很好,比如\ d,我也不熟悉.NET,但我使用了以下正则表达式匹配值对:

 (X[0-9.-]+Y[0-9.-]+) 

更换是

 $1G54 

只要值对没有直接后跟数字,句点或破折号,这将起作用。

为了对输入很挑剔,你可以使用

 string num = @"-?(?:\d+\.\d+|\d+\.|\.\d+|\d+)"; content = Regex.Replace(content, "(?X" + num + ")(?Y" + num + ")", "${x}${y}G54"); 

Y值是否有可靠的终止符? 说它是空白:

 content = Regex.Replace(content, @"(X.+?)(Y.+?)(\s)", "$1$2G54$3"); 

代码需要多强大? 如果它正在重写调试输出或其他一些快速而肮脏的任务,请保持简单。

我知道这不能直接回答你的问题,但你应该查看Expresso 。 它是一个.NET正则表达式工具,允许您调试,测试和微调复杂的表达式。 这是一个救生员。

更多的自己动手回答,但即使有人在这里给你答案,它也会有所帮助。

看起来你只需要支持可选的负值:

 content = Regex.Replace(content, @"(X-?(?:\d*\.)?\d+)*(Y-?(?:\d*\.)?\d+)", "$1$2G54");