出于兼容性原因,我正在将美国的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
在文本处理方面,正则表达式是我的一大弱点,我很感激任何帮助。
答案 0 :(得分:1)
我会分两步完成。首先收集字符串中的每个路径。第二步从您不想保留的每个字符串中删除文本。
First Regex
它捕获路径中的所有属性,而不考虑它们在标记中的顺序。它还会跳过一些有问题的问题,其中属性值可能包含看起来像实际标记的字符串。
<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']