检查结果中是否存在正则表达式组

本文关键字:正则表达式 存在 是否 结果 检查 | 更新日期: 2023-09-27 17:55:41

我正在尝试从一行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 值,以便我可以创建它们的向量。当我拥有所有 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 类将在一行上处理注释、CRC 检查、行号和多个命令。