获取字母后数字:
cnc.need_F = Get_G_Value(input, @"[Ff]\d+", out cnc.F速度);// 字母后的数字
cnc.need_G = Get_G_Value(input, @"[Gg]\d+", out cnc.G指令);// 字母后的数字
cnc.need_X = Get_G_Value(input, @"[Xx][-+]?\d+\.?\d+", out cnc.X坐标);// 字母后的数字
cnc.need_Y = Get_G_Value(input, @"[Yy][-+]?\d+\.?\d+", out cnc.Y坐标);// 字母后的数字
cnc.need_Z = Get_G_Value(input, @"[Zz][-+]?\d+\.?\d+", out cnc.Z坐标);// 字母后的数字
public bool Get_Value64(Match match, out double num)
{
//match = Regex.Match(match.Value, @"[-]?\d+\.?\d+"); // - .【去字母】
match = Regex.Match(match.Value, @"[-]?\d+\.?(\d+)?"); // - .【去字母】
if (double.TryParse(match.Value, out num)) return true;
return false;
}
public bool Get_G_Value(string input, string pattern, out double i64)// 字母后的数字
{// 自裁出匹配条件的数据
//MatchCollection matches = Regex.Matches(input, pattern);
//Match matches = (Match)Regex.Matches(input, pattern);
//foreach (Match match in matches)
//{
// return int.Parse( match.Value);
//}
Match X字母;
//X字母 = Regex.Match(input, $@"[{pattern}][-+]?\d+\.?\d+");// 字母后数字 X+123.456
X字母 = Regex.Match(input,pattern);// 字母后数字 X+123.456
return Get_Value64(X字母, out i64);// 去字母
}
下面是一个使用C#编写的解析G代码的示例方法:
下面是一个使用C#编写的解析G代码的示例方法:
csharp
using System;
using System.Collections.Generic;
public class GCodeParser
{
public static List<GCodeCommand> ParseGCode(string gcode)
{
var commands = new List<GCodeCommand>();
// 按行分割G代码
var lines = gcode.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
// 忽略空行和注释行
if (string.IsNullOrWhiteSpace(line) || line.Trim().StartsWith(";"))
{
continue;
}
// 分割行为指令和参数
var parts = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 0)
{
continue;
}
// 第一个部分是指令
var command = new GCodeCommand();
command.Instruction = parts[0].ToUpper();
// 其余部分是参数
for (int i = 1; i < parts.Length; i++)
{
var parameter = parts[i];
// 分割参数名和值
var equalsIndex = parameter.IndexOf('=');
if (equalsIndex > 0)
{
var parameterName = parameter.Substring(0, equalsIndex);
var parameterValue = parameter.Substring(equalsIndex + 1);
command.Parameters[parameterName] = parameterValue;
}
else
{
// 参数没有指定名称,默认使用字母序号作为参数名
command.Parameters[i.ToString()] = parameter;
}
}
commands.Add(command);
}
return commands;
}
}
public class GCodeCommand
{
public string Instruction { get; set; }
public Dictionary<string, string> Parameters { get; set; }
public GCodeCommand()
{
Parameters = new Dictionary<string, string>();
}
}
使用示例:
csharp
var gcode = "G1 X10 Y20 Z30" + Environment.NewLine +
"G2 X50 Y50 R20" + Environment.NewLine +
"G28" + Environment.NewLine +
"; This is a comment" + Environment.NewLine +
"G90";
var commands = GCodeParser.ParseGCode(gcode);
foreach (var command in commands)
{
Console.WriteLine("Instruction: " + command.Instruction);
foreach (var parameter in command.Parameters)
{
Console.WriteLine("Parameter: " + parameter.Key + " = " + parameter.Value);
}
Console.WriteLine();
}
输出结果:
Instruction: G1
Parameter: 1 = X10
Parameter: 2 = Y20
Parameter: 3 = Z30
Instruction: G2
Parameter: 1 = X50
Parameter: 2 = Y50
Parameter: 3 = R20
Instruction: G28
Instruction: G90