2010-05-10 57 views
3

我開始掌握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取代它呢?

回答

2

您所需要的正則表達式是:

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 bar 
+0

完美的作品。非常感謝。 – fraXis 2010-05-10 22:31:42

+0

或'X [0-9 .-] + Y [0-9 .-] +' – Armstrongest 2010-05-10 22:34:46

+0

這現在也匹配類似「X-17--2..3.-Y -... 1」這樣的字符串。 ',我不認爲他想要。他在他的問題中的原始正則表達式特別過濾掉非數字表達式(它只接受像.5或2.3或44這樣的數字)。這不會引入誤報嗎? – 2010-05-10 22:42:56

0

我知道這並不直接回答你的問題,但你應該檢查出Expresso。它是一個.NET正則表達式工具,允許您調試,測試和微調複雜的表達式。這是一種拯救生命的方式。

更多的是自己動手做的答案,但即使有人在這裏給出答案也會有所幫助。

+0

太棒了。謝謝你的提示。 – fraXis 2010-05-10 22:32:34

0

它看起來像你只需要支持可選的負值:

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

當在我的測試用例上運行時,這會輸出'「foo X17.8Y-1G54.bar」'。 – 2010-05-10 23:10:43

+0

@馬克拜爾斯:看到我對你的答案的評論,但是,我的是不正確的。我基於它的原始正則表達式,只是增加了對底片的支持。原始正則表達式還存在其他問題。 gbacon的回答是最準確的。 – 2010-05-10 23:39:01

1

要挑剔的輸入,你可以使用

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

是否有Y值可靠的終結者?假設它是空白:

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

代碼需要多強大?如果它正在重寫調試輸出或其他快速和骯髒的任務,請保持簡單。

1

X後」會發生什麼(值)Y(值)「在你的文本文件?空間?換行符?另一個「X(值)Y(值)」值對?

我不是很好的使用正則表達式的快捷方式,如\ d,我也不是熟悉的.NET,但我已經用下面的正則表達式匹配值對:

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

和替換是

$1G54 

只要值對之後沒有數字,句點或破折號,它就會工作。

+0

我對於'\ d'上的'[0-9]'語法是一個狂熱的粉絲。它更具可讀性並且具有正則表達式,任何增強可讀性的東西都是一件好事。 – Armstrongest 2010-05-10 22:27:52