这个String.Replace方法做什么?

时间:2016-02-20 14:01:10

标签: javascript regex string xojo

我正在尝试将此Javascript代码移植到另一种语言(Xojo):

Vertices.fromPath = function(path, body) {
    var pathPattern = /L?\s*([\-\d\.e]+)[\s,]*([\-\d\.e]+)*/ig,
        points = [];

    path.replace(pathPattern, function(match, x, y) {
        points.push({ x: parseFloat(x), y: parseFloat(y) });
    });

    return Vertices.create(points, body);
};

我知道路径应该是一个包含x对数字的字符串(SVG格式,如"L 50 25 L 100 10")。我是否认为这会将早期的字符串拆分为两个对象50,25100,10,然后将它们推送到点数组?

2 个答案:

答案 0 :(得分:2)

不确定您是否知道/L?\s*([\-\d\.e]+)[\s,]*([\-\d\.e]+)*/ig是正则表达式搜索字符串。

如果我快速解密,我会说它寻求一个可选的" L"在开始时,然后是可选的空格,然后是一个数字(即任何包含数字,句号,减号或" e"),空格或逗号,另一个数字,以及数字周围的括号表示这些是匹配的值传递给replace()调用中的函数。 " ig"最后是选项,其中" i"意味着忽略案例IIRC。

因此,该代码似乎只能获取两个数字,可选地前面有一个" L"。然后它将这些数字读入x和y,并将它们附加到points数组。

在Xojo中,您必须在循环中执行此操作(Xojo不支持本地函数),使用RegEx类重复解析字符串。要将扫描的数字转换为双精度数,请使用Val()功能。

答案 1 :(得分:1)

虽然您的问题中的正则表达式将匹配单个“L”字母后面的两个数字,但它也会匹配许多其他无法解析为有效数字的内容。 你是对的,这段代码将创建两个对象,这些对象的X和Y属性是从匹配的数字中填充的。

使用Realbasic.Points来保存坐标,可以通过以下Xojo片段实现此功能:

Dim inString As String = "L 50 25 L 100 10"
Dim outArray(-1) As Realbasic.Point

Dim rx As New RegEx()
Dim match As RegExMatch
rx.SearchPattern = "L?\s*([\-\d.e]+)[\s,]*([\-\d.e]+)*"
match = rx.Search(inString) // Get the first matching part of the string, or nil if there's no match
While match <> nil
    dim x As Integer = match.SubExpressionString(1).Val() // X coordinate is captured by the first group
    dim y As Integer = match.SubExpressionString(2).Val() // Y coordinate is captured by the second group
    dim p As new REALbasic.Point(x, y)
    outArray.Append(p)
    match = rx.Search() // Get the next matching part, or nil if there's no more
Wend

如果您需要仅匹配数字并希望在String-&gt; Double转换期间防止错误,则应将正则表达式模式更新为以下内容:

"L?\s+(\-?\d+(?:\.\d+)?(?:e-?\d+)?)[\s,]+(\-?\d+(?:\.\d+)?(?:e-?\d+)?)"

原始模式将匹配'Lee ... --- ...',这个更新的模式需要在'L'和数字之间至少有一个空格,并且在可能是其中一部分的字符上不匹配一个数字,但它们不构成有效的数字表示。