我必须为cnc机器代码编写一个转换器。
我没有使用Regex的经验,也很难跟随其他人的例子,特别是关于创建“Delimiter”-Expressions。
我正在努力删除部分字符串(从字符“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和B与X和Ys值完全相同,只是使用不同的字符。
答案 0 :(得分:3)
你可以这样做的一种方法 - 假设你上面发布的格式可靠且一致 - 是将字符串拆分成空格分隔的字符串数组。迭代并重新声明字符串,同时跳过第一个字符为&#39; Z&#39;。
的任何元素。这可能看起来像这样:
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)进行格式化,或者这些标记是否可以存在于字符串中的任何位置。
答案 1 :(得分: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