我想获取一个集合的字符串表示并解析它。有人知道任何已有的图书馆吗?
我可以编写正则表达式来匹配这些模式,但在我看来,它并不是一种非常有效的方法。还有一些边缘情况会允许某些字符串传递,而不应该这样,我可能会遗漏其他一些情况。
例如,我想解析如下字符串:
"{10,-20,30.5,-40.01,.5,-.5}"
//^\{((-?[0-9]*(\.[0-9]+)?)(?:,|\}))+$
.Parse()
.ShouldEqual(new [] { 10,-20,30.5,-40.01,.5,-.5 });
"{(10,10),(20,2),(30.2,-5.5),(-5,40),(-.2,3000),(-.1,-.2)}"
//^\{(\((-?[0-9]*(\.[0-9]+)?),(-?[0-9]*(\.[0-9]+)?)\)(?:,|}))+$
.Parse()
.ShouldEqual(new [] {
new Point(10,10),
new Point(20,2),
new Point(30.2,-5.5),
new Point(-5,40),
new Point(-.2,3000),
new Point(-.1,-.2)
});
"{(10,[10,1]),(20,[2,4]),(30.2,[-5.5,-10]),(-5,[40,10]),(-.2,[3000,10]),(-.1,[-.2,0])}"
//^\{(\((-?[0-9]*(\.[0-9]+)?),\[((-?[0-9]*(\.[0-9]+)?)(?:,|\]))+\)(?:,|}))+$
.Parse()
.ShouldEqual(new [] {
new Point(10,new[]{ 10,1 }),
new Point(20,new[]{2,4}),
new Point(30.2,new[]{-5.5,-10}),
new Point(-5,new[]{40,10}),
new Point(-.2,new[]{3000,10}),
new Point(-.1,new[]{-.2,0})
});
Point类是任意的。
答案 0 :(得分:1)
我不知道可以这样做的.net库。
设定表示应该有多复杂? 它只是由
组成还是应该允许复杂的结构,如间隔或设置理解? ({ f(x) | x <- [1, 10), g(x) < 42 ^ q(x) = 0 }
)。
如果您的 set 只有一个简单的表单(可能只是一个值的枚举),我会使用正则表达式或内置字符串函数手动解析它。
否则这应该很难解析和评估 - 考虑使用像Irony这样的编译器编译器工具
请注意,集合是无序的,也可以是无限的。基于数组的输出不适合这里 - 您首先必须开发一个表示集合的概念。或者你只是想解析一个列表?
答案 1 :(得分:0)
嵌入IronPython并使用Execute方法可能是个不错的选择。
Here's a StackOverflow question on the topic.
另见A 3 minute guide to embedding IronPython in a C# application