2014-10-27 64 views
-1

我必須爲cnc機器碼編寫一個轉換器。如何編輯帶有未知分隔符的字符串

我沒有使用正則表達式的經驗,它很難遵循其他例子,特別是關於創建「分隔符」 - 表達式。

我很努力地部分刪除字符串(從字符「Z」直到行尾)。基本上,這是我和需要轉換:

N11 G0 X49.000 Y30.329 Z0.000 
N12 G0 X49.000 Y30.329 Z-1.000 
N13 G1 X49.000 Y50.329 Z-1.000 F500 
N14 X49.000 Y150.000 Z0.000 
N15 X49.300 Y150.700 Z-15.000 F400 
N16 X50.000 Y151.000 Z+1000.000 
N17 X150.000 Y151.000 Z-1.000 

的結果應該是:

N11 G0 X49.000 Y30.329 A49.000 B30.329 
N12 G0 X49.000 Y30.329 A49.000 B30.329 
N13 G1 X49.000 Y50.329 A49.000 B50.329 F500 
N14 X49.000 Y150.000 A49.000 B150.000 
N15 X49.300 Y150.700 A49.300 B150.700 F400 
N16 X50.000 Y151.000 A50.000 B151.000 
N17 X150.000 Y151.000 A150.000 B151.000 

這就是我想編輯這些字符串迭代:

for (int i = 11; i < oldIso.Length; i++) 
{ 
    converted.AppendLine(RemoveBetween(oldIso[i], 'z', endofline)); 
} 

所以我不確定我怎樣才能儘可能好地解決這個問題。我想過從字符「Z」刪除直到行結束。那時候我會關心「F500/F400」。 A和Bs與X和Ys值完全相同,只是具有不同的字符。

+2

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2014-10-27 18:19:29

+3

「A49」和「B30」從哪裏來? – Jonesopolis 2014-10-27 18:20:35

+0

A和Bs與X和Ys值完全相同,只是具有不同的字符。 – kentor 2014-10-27 18:23:47

回答

3

你可以這樣做的一種方法 - 假設你上面發佈的格式是可靠和一致的 - 將字符串拆分爲空格分隔的字符串數組。在跳過任何第一個字符爲'Z'的元素時迭代並重新對齊字符串。

這可能看起來像這樣:

string line = "N12 G0 X49.000 Y30.329 Z-1.000"; 
string[] splitLine = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 

StringBuilder stringBuilder = new StringBuilder(); 

foreach (string splitString in splitLine) 
{ 
    if (splitString[0] != 'Z') 
    { 
     // don't forget to add the spaces back 
     stringBuilder.Append(splitString + " "); 
    } 
} 

string finalString = stringBuilder.ToString(); 

這可能是關閉基地 - 你說,分隔符是未知的,但每次張貼樣本線預見的界定。這個例子將要刪除的任何工作,雖然 - 如果你決定你不想令牌以F開頭,再加上一點有條件原來的,就像這樣:

if (splitString[0] != 'Z' && splitString[0] != 'F' /* and etc. and etc. */) 

的A和B段我們我需要更多的信息,並且看起來部分像是一個單獨的問題。對於初學者,我們需要知道這些行是按照您所顯示的順序(X Y A B)格式化的,還是這些標記可以存在於字符串中的任何位置。

+0

感謝這個好主意!我會嘗試這一點,並將它標記爲正確的,當我得到它運行:)。 – kentor 2014-10-27 18:28:15

1

這個表達式將會給你輸入的每一行新線,使用捕獲組:

string line = "N11 G0 X49.000 Y30.329 Z0.000"; 
var newLine = Regex.Replace(line, @"([^X]+)X([^Y]+)Y([^Z]+).+", @"$1X$2Y$3A$2B$3"); 

//newLine = N11 G0 X49.000 Y30.329 A49.000 B30.329 
+0

哇這是瘋了,但我不明白這是如何工作。也感謝你! – kentor 2014-10-27 18:43:18

+1

你應該看看捕獲組,幾乎括號中的內容被捕獲並在替換中重現 – Jonesopolis 2014-10-27 18:45:44