检查结果中是否存在正则表达式组
Check if regex group exists in result
我正在尝试从一行 gcode 中提取数据,它可能类似于以下任何一种:
G01 X10. Y20. Z3.0 F15.
G00X.500Y-10.
G01 Y10.X20.150
现在我已经创建了与组完美匹配的正则表达式:
(G|M|X|Y|Z|I|J|K|F)(?<val>-?\d*\.?\d+\.?)
这似乎效果很好。我为每个结果得到三组数据,例如:
G01 X10. Y20. Z3.0 F15.
G01 | G | 01
X10. | X | 10.
Y20. | Y | 20.
Z3.0 | Z | 3.0
F15. | F | 15.
我想做的是能够检查输入字符串中有哪些值,这样我就可以提取数据并发出位置命令。以上面的示例为例,我只想提取 X、Y 和 Z 值,以便创建它们的 Vector。当我拥有所有 3 个值时,这很容易做到,但是如果输入字符串是 G01 X10. Y5.0
?
,我如何检查第一组中是否存在值
为此,我决定遍历每个正则表达式匹配项,然后检查第一组是 X、Y 还是 Z,并使用 switch 语句更改 3D 向量的值。这是代码,以防其他人想产生类似的东西:
public static void ExtractAll(string gcode)
{
dataPos = Vector3.zero;
var match = Regex.Matches(gcode, @"(G|M|X|Y|Z|I|J|K|F)(?<val>-?\d*\.?\d+\.?)");
for (int i = 0; i < match.Count; i++)
{
switch (match[i].Groups[1].Value)
{
case "X":
dataPos.x = float.Parse(match[i].Groups["val"].Value);
break;
case "Y":
dataPos.y = float.Parse(match[i].Groups["val"].Value);
break;
case "Z":
dataPos.z = float.Parse(match[i].Groups["val"].Value);
break;
}
}
print(dataPos);
}
请注意,要使用正则表达式,您需要包含它的命名空间:
using System.Text.RegularExpressions;
我刚刚启动了一个有助于提取信息的 GCode 解析库:https://github.com/chrismiller7/GCodeNet
您可以像下面这样使用它:
var cmd = Command.Parse("G01 X10. Y20. Z3.0 F15.");
var X = cmd.GetParameterValue(ParameterType.X);
var Y = cmd.GetParameterValue(ParameterType.Y);
var Z = cmd.GetParameterValue(ParameterType.Z);
此外,您可以阅读整个 gcode 文件:
var gcodeFile = new GCodeFile(File.ReadAllText("file.gcode"));
foreach (var cmd in gcodeFile.Commands)
{
var X = cmd.GetParameterValue(ParameterType.X);
var Y = cmd.GetParameterValue(ParameterType.Y);
var Z = cmd.GetParameterValue(ParameterType.Z);
}
GCodeFile class 将在一行中处理注释、CRC 检查、行号和多个命令。
我正在尝试从一行 gcode 中提取数据,它可能类似于以下任何一种:
G01 X10. Y20. Z3.0 F15.
G00X.500Y-10.
G01 Y10.X20.150
现在我已经创建了与组完美匹配的正则表达式:
(G|M|X|Y|Z|I|J|K|F)(?<val>-?\d*\.?\d+\.?)
这似乎效果很好。我为每个结果得到三组数据,例如:
G01 X10. Y20. Z3.0 F15.
G01 | G | 01
X10. | X | 10.
Y20. | Y | 20.
Z3.0 | Z | 3.0
F15. | F | 15.
我想做的是能够检查输入字符串中有哪些值,这样我就可以提取数据并发出位置命令。以上面的示例为例,我只想提取 X、Y 和 Z 值,以便创建它们的 Vector。当我拥有所有 3 个值时,这很容易做到,但是如果输入字符串是 G01 X10. Y5.0
?
为此,我决定遍历每个正则表达式匹配项,然后检查第一组是 X、Y 还是 Z,并使用 switch 语句更改 3D 向量的值。这是代码,以防其他人想产生类似的东西:
public static void ExtractAll(string gcode)
{
dataPos = Vector3.zero;
var match = Regex.Matches(gcode, @"(G|M|X|Y|Z|I|J|K|F)(?<val>-?\d*\.?\d+\.?)");
for (int i = 0; i < match.Count; i++)
{
switch (match[i].Groups[1].Value)
{
case "X":
dataPos.x = float.Parse(match[i].Groups["val"].Value);
break;
case "Y":
dataPos.y = float.Parse(match[i].Groups["val"].Value);
break;
case "Z":
dataPos.z = float.Parse(match[i].Groups["val"].Value);
break;
}
}
print(dataPos);
}
请注意,要使用正则表达式,您需要包含它的命名空间:
using System.Text.RegularExpressions;
我刚刚启动了一个有助于提取信息的 GCode 解析库:https://github.com/chrismiller7/GCodeNet
您可以像下面这样使用它:
var cmd = Command.Parse("G01 X10. Y20. Z3.0 F15.");
var X = cmd.GetParameterValue(ParameterType.X);
var Y = cmd.GetParameterValue(ParameterType.Y);
var Z = cmd.GetParameterValue(ParameterType.Z);
此外,您可以阅读整个 gcode 文件:
var gcodeFile = new GCodeFile(File.ReadAllText("file.gcode"));
foreach (var cmd in gcodeFile.Commands)
{
var X = cmd.GetParameterValue(ParameterType.X);
var Y = cmd.GetParameterValue(ParameterType.Y);
var Z = cmd.GetParameterValue(ParameterType.Z);
}
GCodeFile class 将在一行中处理注释、CRC 检查、行号和多个命令。