这是一个正则表达式问题。
感谢您的帮助,请耐心等待,因为 RegEx 绝对不是我的强项!
完全作为背景...我问的原因是我想使用 RegEx 来解析类似于 SVG 路径数据段的字符串。我一直在寻找解析段及其段属性的先前答案,但没有发现任何可以正确执行后者的答案。
以下是一些示例字符串,例如我需要解析的字符串:
M-11.11,-22
L.33-44
ac55 66
h77
M88 .99
Z
我需要将字符串解析成这样的数组:
["M", -11.11, -22]
["L", .33, -44]
["ac", 55, 66]
["h", 77]
["M", 88, .99]
["Z"]
到目前为止,我在这个答案上找到了这段代码: Parsing SVG "path" elements with C# - 是否有库可以做到这一点? 帖子是 C#,但正则表达式在 javascript 中很有用:
var argsRX = /[\s,]|(?=-)/;
var args = segment.split(argsRX);
这是我得到的:
[ "M", -11.11, -22, <empty element> ]
[ "L.33", -44, <empty>, <empty> ]
[ "ac55", <empty>, <empty>, <empty>, 66 <empty> ]
[ "h77", <empty>, <empty>
[ "M88", .99, <empty>, <empty> ]
[ "Z", <empty> ]
使用此正则表达式时的问题:
- 一个不需要的空数组元素被放在每个字符串数组的末尾。
- 如果多个空格是分隔符,则会为每个额外的空格创建一个不需要的空数组元素。
- 如果数字紧跟在开头字母之后,则该数字将附加到字母上,但应成为单独的数组元素。
以下是传入字符串的更完整定义:
- 每个字符串以 1 个或多个字母开头(大小写混合)。
- 接下来是零个或多个数字。
- 数字可能有减号(总是在前面)。
- 数字可能在数字中的任何位置都有小数点(结尾除外)。
- 可能的分隔符有:逗号、空格、空格、减号。
- 前面或后面带有空格的逗号也是可能的分隔符。
- 即使减号是分隔符,它们也必须与它们的数字保持一致。
- 一个数字可能会紧跟在开头字母之后(没有空格),并且该数字应该是分开的。
这是我一直在使用的测试代码:
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
</style>
<script>
$(function(){
var pathData = "M-11.11,-22 L.33-44 ac55 66 h77 M88 .99 Z"
// separate pathData into segments
var segmentRX = /[a-z]+[^a-z]*/ig;
var segments = pathData.match(segmentRX);
for(var i=0;i<segments.length;i++){
var segment=segments[i];
//console.log(segment);
var argsRX = /[\s,]|(?=-)/;
var args = segment.split(argsRX);
for(var j=0;j<args.length;j++){
var arg=args[j];
console.log(arg.length+": "+arg);
}
}
}); // end $(function(){});
</script>
</head>
<body>
</body>
</html>