首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用哪个正则表达式将此字符串转换为数组?

问使用哪个正则表达式将此字符串转换为数组?
EN

Stack Overflow用户
提问于 2012-05-14 08:34:22
回答 3查看 1.1K关注 0票数 3

在mysql中的一个地理空间列中,我得到了以下字符串值,我想将其转换为一个数组。最终目标是将其转换为geoJSON。

代码语言:javascript
复制
POLYGON((4.885838 52.388063,4.891061 52.388381,4.890973 52.382909))

这个字符串有三个坐标对,x和y坐标用空格隔开,对用逗号隔开。确切的数字是未知的和可变的。另外,POLYGON可以有三种不同的设置。

就凭我对雷格的一点点了解。我想出的表达式如下:

代码语言:javascript
复制
$pat = '/^(POLYGON|LINESTRING|POINT)(\(\() (.....) (\)\))$/';
preg_match($pat, $str, $matches);

以坐标的一部分和两个括号作为不确定的部分。

有人能帮我吗?

编辑最终得到的数组应该如下所示:

代码语言:javascript
复制
$array['type'] = POLYGON | LINESTRING ....
$array['coordinates'] = array of all the coordinates.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-14 08:42:12

我认为只在坐标字符串上使用分解和地图更容易,也更易于维护:

代码语言:javascript
复制
$coordString = $matches[3];
$coordinates = array_map(function($e) { return explode(' ', $e); },
                         explode(',', $coordString));
票数 0
EN

Stack Overflow用户

发布于 2012-05-14 08:44:54

你最好分阶段解决这个问题。只有第一阶段需要使用regex:

  1. 例如,将整个坐标字符串查找为一个glob: "4.885838 52.388063,4.891061 52.388381,4.890973 52.382909"
  2. 将该字符串拆分为由逗号分隔的坐标对。在Python中,我们将使用str.split(',')。我相信您的PHP等价物称为explode()。 [ "4.885838 52.388063" , "4.891061 52.388381" , "4.890973 52.382909" ]
  3. 将每个坐标对分割成两个由空格分隔的数字:str.split(' ')。 [ ["4.885838","52.388063"] , ["4.891061","52.388381"] , ["4.890973","52.382909"] ]
  4. 转换为浮动。在python中,我们使用float():您的本地等价物可能称为str2float()或类似的。 [ [4.885838,52.388063] , [4.891061,52.388381] , [4.890973,52.382909] ]

若要查找步骤1的数字字符串,请尝试正则表达式。

代码语言:javascript
复制
([-]?\d+.\d+ [-]?\d+.\d+)((,[-]?\d+.\d+ [-]?\d+.\d+)+)?

它找到至少一对x y格式的坐标,坐标对用逗号分隔。您可以看到正则表达式在雷杰斯上的作用。

票数 2
EN

Stack Overflow用户

发布于 2020-04-07 13:37:05

我也遇到了同样的问题,但是在我的例子中,我发现像POLYGON ((-1.23 2.34, 3.45 4.56), (3.21 4.32, 5.43 6.54))这样的模式和上面的正则表达式对我来说执行步骤1不起作用。然后,您将遍历在逗号上拆分的匹配,最后在空格上拆分。我不是正则大师,所以也许有人有更好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10579889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档