关于对特定字符串的解析的问题,请大家不吝赐教!!
关于对特定字符串的解析的问题
有如下一个字符串(为方便大家查看,特做对齐处理)
MultiPolygon
(
((10 10, 10 20, 20 20, 20 15, 10 10),(5 5, 2 3, 3 2, 5,5))
,((60 60, 70 70, 80 60, 60 60 ))
)
上述MultiPolygon中含有2个多边形[1).含一个有一个孔的多边形; 2).实心多边形]
已知各个类间的构造参数及关系,如下:
Coordinate(double x, double y) //一个坐标对(含x,y轴坐标)
CoordinateSequence(Coordinate[] coordinates) //坐标序列(由坐标对数组构成)
Ring(coordinateSequence) //一个环(由一个坐标序列构成)
MultiPolygon(Ring shell, Ring[] holes) //一个多边形(含x个孔)
提示:
1).一个坐标对是由2个数值组成的.
2).MultiPolygon中的多边形及多边形的孔的个数是不确定的
问题:本人想通过传入一个类似于上述的那个紫色的字符串,然后通过解析最终能够正确构造出一个MultiPolygon的对象出来。虽然我知道可利用字符串的split函数来分割进行解析处理,但如果这样的话,总感觉程序有很大的改进空间。因此特想向大家请教一下是否还有更为简便的方法来解决?不甚感激!
[解决办法]
json格式 ?
[解决办法]
不太清楚
[解决办法]
代码简短不等于运行效率吧...
我觉得没必要如此字斟句酌...
[解决办法]
第一:你走弯路了!
json 借助 eval函数就可以直接构建js对象,相反渲染倒是你的难题。
第二:你的不太好整
var R = {TX:[{a:"bbb"},{a:"qqq"}]};
var tt = R.TX;
alert(tt[0].a);
alert(tt[1].a);
我都是胡说八道,不要相信我呀!!
[解决办法]
我想知道的是.简化的定义是什么?
[解决办法]
例如拿坐标对.你前面应该已经做过判断.
输入的字符串应该是固定形式.
所以就匹配数字,2个一组...
[解决办法]
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language(http://www.crockford.com/javascript), Standard ECMA-262 3rd Edition - December 1999(http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf)的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、 ture、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
除去一些编码细节,以下描述了完整的语言。
字符串(string)与C或者Java的字符串非常相似。除去未曾使用的八进制与十六进制格式,数值(number)也与C或者Java的数值非常相似。
空白可以加入到任何符号之间。
不过我还是建议用split函数来分割
[解决办法]
如果有时间你可以研究下extjs的数据处理方式。
希望能对你有所帮助。
[解决办法]
<textarea id="txt1" rows="15" cols="60">MultiPolygon ( ( (10 10, 10 20, 20 20, 20 15, 10 10), (5 5, 2 3, 3 2, 5,5) ), ( (60 60, 70 70, 80 60, 60 60 ) ) )</textarea><script >// (10 10, 10 20, 20 20, 20 15, 10 10), 这样子是一个 "环" 吧// (环, ... , 环) 这样子是一个多边形吧// 这样子的话,你整个字符串中就含有 多个 多边形了, 不只 一个 啊function Coordinate(x, y) //一个坐标对(含x,y轴坐标){ this.x = x; this.y = y;}function CoordinateSequence(coordinates) //坐标序列(由坐标对数组构成){ this.coordinates = coordinates;}function Ring(coordinateSequence) //一个环(由一个坐标序列构成) { this.coordinateSequence = coordinateSequence;}function MultiPolygon(shell, holes) //一个多边形(含x个孔){ this.shell = shell; this.holes = holes;}Array.prototype.each = function(func){ for (var i=0; i<this.length; i++) this[i] = func(this[i]); return this;};function parseMultiPolygons(str) { str = str.replace(/([\d.]+)\s+([\d.]+)/g, "[$1,$2]"); str = str.replace(/\(/g, "[").replace(/\)/g, "]").replace(/^\s*MultiPolygon/i, ""); eval("var arr=" + str); arr.each(function(m) { m.each(function(ring) { return new Ring(new CoordinateSequence( ring.each(function(coordinate) { return new Coordinate(coordinate[0], coordinate[1]); }) )); }); return new MultiPolygon(m[0], m.slice(1)); }); return arr;}var mpgs = parseMultiPolygons(txt1.value);alert(mpgs[0].shell.coordinateSequence.coordinates[1].x);alert(mpgs[0].holes[0].coordinateSequence.coordinates[2].y);</script>
[解决办法]
请参考《编译原理》中的词法分析、有限状态自动机相关内容。
[解决办法]
帮顶!
[解决办法]
顶
[解决办法]