gpt4 book ai didi

javascript - 使用正则表达式解析复杂定界的字符串

转载 作者:行者123 更新时间:2023-12-03 16:26:41 25 4
gpt4 key购买 nike

这是一个 RegEx 问题。

感谢任何帮助,请耐心等待,因为 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# - are there libraries out there to do this?该帖子是 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>

最佳答案

^([a-z]+)(?:(-?\d*.?\d+)[^\d\n\r.-]*(-?\d*.?\d+)?)?

解释

^               # start of string([a-z]+)        # any number of characters, match into group 1(?:             # non-capturing group  (-?\d*.?\d+)  #   first number (optional singn & decimal point, digits)  [^\d\n\r.-]*  #   delimiting characters (anything but these)  (-?\d*.?\d+)? #   second number)?              # end non-capturing group, make optional

与“不区分大小写”标志一起使用。

关于javascript - 使用正则表达式解析复杂定界的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17017748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com