C#如何解析键值无分隔符的字符串及实现G代码行变量赋值
C#实现两个解析需求:无分隔符键值对与G代码行解析
一、解析无分隔符的键值对字符串
先来说这个无分隔符的键值对解析——比如像X-0.336Y13.564Z0.5这种格式,键是单个大写字母,值是带正负的小数或整数。咱用正则表达式来匹配最省心,效率还高。
实现代码
using System; using System.Collections.Generic; using System.Text.RegularExpressions; public static class KeyValueParser { // 预编译正则:匹配大写字母键 + 带正负的小数/整数值 private static readonly Regex _keyValueRegex = new Regex(@"([A-Z])([-+]?\d+(\.\d+)?)", RegexOptions.Compiled); public static Dictionary<char, double> ParseKeyValueString(string input) { var keyValuePairs = new Dictionary<char, double>(); if (string.IsNullOrWhiteSpace(input)) return keyValuePairs; // 捕获所有符合格式的键值对 var matches = _keyValueRegex.Matches(input); foreach (Match match in matches) { char key = char.Parse(match.Groups[1].Value); if (double.TryParse(match.Groups[2].Value, out double value)) { keyValuePairs[key] = value; } } return keyValuePairs; } }
代码说明
- 正则表达式
([A-Z])([-+]?\d+(\.\d+)?):([A-Z]):捕获单个大写字母作为键([-+]?\d+(\.\d+)?):捕获可选正负号、整数部分,以及可选的小数部分
RegexOptions.Compiled预编译正则,提升多次调用的性能- 用
double.TryParse避免解析失败抛出异常,容错性拉满
二、逐行解析G代码行,赋值x/y/z变量
接下来是G代码的解析需求,规则很明确:每行提取X、Y、Z对应的值,没有的话就设为100000。咱直接复用上面的键值对解析逻辑,不用重复造轮子。
实现代码
using System; using System.IO; public static class GCodeParser { public static void ParseGCodeFile(string filePath) { if (!File.Exists(filePath)) { Console.WriteLine("指定文件不存在,请检查路径!"); return; } // 逐行读取文件,内存友好,适合大文件 foreach (string line in File.ReadLines(filePath)) { var parsedValues = KeyValueParser.ParseKeyValueString(line); // 赋值逻辑:存在对应键就取数值,否则设为100000 double x = parsedValues.TryGetValue('X', out double xVal) ? xVal : 100000; double y = parsedValues.TryGetValue('Y', out double yVal) ? yVal : 100000; double z = parsedValues.TryGetValue('Z', out double zVal) ? zVal : 100000; // 这里可以根据业务需求替换成存储到对象、写入数据库等操作 Console.WriteLine($"原行内容: {line}"); Console.WriteLine($"解析结果: x={x}, y={y}, z={z}\n"); } } }
使用示例
假设你有个gcode_sample.txt文件,内容如下:
G1 Z0.500 F7800.000 G1 X-0.336 Y13.564 F7800.000 G0 X10 Y20 Z30
调用GCodeParser.ParseGCodeFile("gcode_sample.txt");,输出结果会是:
原行内容: G1 Z0.500 F7800.000 解析结果: x=100000, y=100000, z=0.5 原行内容: G1 X-0.336 Y13.564 F7800.000 解析结果: x=-0.336, y=13.564, z=100000 原行内容: G0 X10 Y20 Z30 解析结果: x=10, y=20, z=30
代码说明
File.ReadLines逐行读取,不会一次性加载整个文件到内存,处理大G代码文件更高效- 复用
KeyValueParser的解析逻辑,减少重复代码维护成本 Dictionary.TryGetValue安全获取值,避免键不存在时抛出异常
内容的提问来源于stack exchange,提问作者Kenta
相关产品推荐
相关产品推荐

