2

出于兼容性的原因,我将美国的 SVG 交互式地图转换为 Javascript 支持的地图。为此,我需要将给定的 SVG 路径转换为 ​​JSON 文件。

一个示例路径列表是

<path 
  d="M 404.13498,227.558 L 407.75898,227.324 L 407.95298,228.019 L 408.99798,
     231.791 L 409.07498,232.061 L 405.21798,232.503 L 404.57198,232.58 L 404.13498,
     227.558" 
  id="01111" 
  inkscape:label="Randolph, AL" 
</path>

我想做的是将其转换为格式

['01111', 'Randolph, AL', 
   'M727,410L734,409L734,410L736,417L736,418L729,419L728,419L727,410']

我知道示例结果已关闭;这是由于示例地图经历了线性扩展。我感兴趣的是转换

M 404.13498,227.558 L 407.75898

进入

M404, 227L407 ... ect

正则表达式是我在文本操作方面的一大弱点,我将不胜感激。

4

1 回答 1

1

描述

我会分两步完成。首先收集字符串中的每个路径。其次,从您不想保留的每个字符串中删除文本。

第一个正则表达式

这将捕获路径中的所有属性,而不考虑它们在标签中的顺序。它还跳过了一些有问题的问题,其中属性值可能包含看起来像实际标签的字符串。

<path\s
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sd=('[^']*'|"[^"]*"|[^'"][^\s>]*))
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sid=('[^']*'|"[^"]*"|[^'"][^\s>]*))
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sinkscape:label=('[^']*'|"[^"]*"|[^'"][^\s>]*))

第二个正则表达式

这只会应用于d属性,它基本上会替换每个数字的所有空格小数部分和换行符。

正则表达式:(?<=\w|\s)\s|\.\d+|[\r\n"]

替换为:无

其他字段将简单地删除它们的双引号。

例子

我不是 javascript 程序员,但是在 powershell 中我会这样处理问题:

代码

$String = '<path 
  d="M 404.13498,227.558 L 407.75898,227.324 L 407.95298,228.019 L 408.99798,
     231.791 L 409.07498,232.061 L 405.21798,232.503 L 404.57198,232.58 L 404.13498,
     227.558" 
  id="01111" 
  inkscape:label="Randolph, AL" 
>
</path>
'

[regex]$FirstRegex = @'
<path\s(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sd=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sid=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sinkscape:label=('[^']*'|"[^"]*"|[^'"][^\s>]*))
'@

$FirstRegex.matches($String) | foreach {

    $d = $_.Groups[1].Value -replace '(?<=\w|\s)\s|\.\d+|[\r\n"]', ""
    $id = $_.Groups[2].Value -replace '"', ""
    $label = $_.Groups[3].Value -replace '"', ""
    Write-Host "['$id', '$label', '$d']"
    } # next match

输出

['01111', 'Randolph, AL', 'M404,227L407,227L407,228L408,231L409,232L405,232L404,232L404,227']
于 2013-07-08T03:31:24.923 回答