描述
我会分两步完成。首先收集字符串中的每个路径。其次,从您不想保留的每个字符串中删除文本。
第一个正则表达式
这将捕获路径中的所有属性,而不考虑它们在标签中的顺序。它还跳过了一些有问题的问题,其中属性值可能包含看起来像实际标签的字符串。
<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']