虽然您问题中的正则表达式确实会匹配单个“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->Double 转换期间防止错误,您应该将正则表达式模式更新为如下内容:
"L?\s+(\-?\d+(?:\.\d+)?(?:e-?\d+)?)[\s,]+(\-?\d+(?:\.\d+)?(?:e-?\d+)?)"
原始模式将匹配“Lee ...----...”,这个更新后的模式需要在“L”和数字之间至少有一个空格,并且不会匹配可能是数字一部分的字符,但它们没有形成有效的数字表示。