2014-10-27 2 views
-1

Мне нужно написать конвертер для машинного кода cnc.Как редактировать строки с неизвестными разделителями

У меня нет опыта работы с Regex и его трудным образом следить за другими примерами, особенно в отношении создания «разделителей» -выражений.

Я борюсь с удалением строки частично (от символа «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/), где консенсус« нет, они не должны ». –

+3

Откуда берутся 'A49' и' B30'? – Jonesopolis

+0

A и Bs точно такие же, как значения X и Ys, только с другим персонажем. – kentor

ответ

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. */) 

А и В сегментах мы Мне нужно немного больше информации и, похоже, как отдельный вопрос. Для начала нам нужно знать, имеет ли значение, что строки отформатированы в указанном порядке (X Y A B), или же эти токены могут существовать в любой точке строки.

+0

Спасибо за эту хорошую идею! Я собираюсь попробовать это и буду отмечать его как правильно, когда я его запустил :). – kentor

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

+1

Вы должны изучить группы захвата, в значительной степени то, что в скобках фиксируется и воспроизводится в замене – Jonesopolis

Смежные вопросы