【发布时间】:2017-01-25 11:09:03
【问题描述】:
我正在尝试找到一种将消息字符串解析为对象的好方法。 该字符串是固定长度的,如下所述。
- 协议 = int(2)
- 消息类型 = 字符串 (1)
- 测量 = 字符串 (4)
- 等
做一个简单的String.Split 会起作用,但我认为当你开始接近字符串的末尾时可能会有点麻烦。例如:
var field1 = s.SubString(0,2);
var field2 = s.SubString(2,4);
....
var field99 = s.SubString(88,4); // difficult magic numbers
我考虑过使用正则表达式,并认为这可能更令人困惑。
我试图想出一个优雅的解决方案,在那里我可以创建一个解析器,它传递一个“配置”,详细说明如何解析字符串。
类似...
MyConfig config = new MyConfig()
config.Add("Protocol", Length=2, typeof(int));
config.Add("MessageType", Length=1, typeof(char));
Parser p = new Parser(config);
var parserResult = p.Parse(message);
...但是我现在正在兜圈子,却没有到达任何地方。任何指针都会有很大帮助。
【问题讨论】:
-
对每一个单独使用正则表达式。这会很简单,不会令人困惑
-
Regex与捕获组可能是我会做的方式,如果我诚实的话 -
正则表达式是提取和解析字符串的合适工具。一个正则表达式组映射到 MyConfig 除了类型,你为什么要自己构建?但是,我不知道您如何在这里利用类型。你有大开关吗?确实,Regex 很难阅读,但您可以使用许多 cmets 仔细构建它。把它分成几块,一点也不混乱。
-
我最近回答了一个类似的问题。我创建了一个函数,它使用像这样的输入数组来解析固定宽度的字符串 string[] tabLocations = {1,20,30,50,70};