从String中提取数字

时间:2012-04-07 09:53:16

标签: .net string c++-cli string-matching pathgeometry

我必须解析一个String来创建一个PathSegmentCollection。该字符串由由逗号和/或(任何)空格分隔的数字组成(如换行符,制表符等),也可以使用科学记数法编写数字。

这是一个例子:"9.63074,9.63074 -5.55708e-006 0 ,0 1477.78"

分数为:P1(9.63074,9.63074),P2(-0,555708,0),P3(0,1477.78)

要提取数字,我使用正则表达式:

Dim RgxDouble As New Regex("[+-]?\b[0-9]+(\.[0-9]+)?(e[+-]?[0-9]+)?\b")
Dim Matches As MatchCollection = RgxDouble.Matches(.Value)
Dim PSegmentColl As New PathSegmentCollection
Dim PFigure As New PathFigure

With Matches

  If .Count < 2 OrElse .Count Mod 2 <> 0 Then Exit Sub

  PFigure.StartPoint = New Point(.Item(0).Value, .Item(1).Value)

  For i As UInteger = 2 To .Count - 1 Step 2
    Dim x As Double = .Item(i).Value, y As Double = .Item(i + 1).Value
    PSegmentColl.Add(New LineSegment With {.Point = New Point(x, y)})
  Next

End With

它可以工作,但我必须解析大约十万(或更多)字符串,并且这种方式太慢了。我想找到一个更有效的解决方案,但是:大多数情况下数字不是用科学记数法编写的,如果你认为这是一种更好的方法,我使用C ++ / CLI编写的使用C / C ++的汇编没有问题。不是托管代码,也不是C#不安全代码。

1 个答案:

答案 0 :(得分:2)

您为什么要自己解析path markup syntax?这是一件复杂的事情,也许是将来要改变(至少扩展)的主题。 WPF可以为您执行此操作:http://msdn.microsoft.com/en-us/library/system.windows.media.geometry.parse.aspx,因此最好让框架运行。


编辑:
如果解析是您的瓶颈,您可以尝试解析自己。我建议尝试以下方法并检查它是否足够快:

char[] separators = new char[] { ' ', ',' }; // should be created only once
var parts = pattern.Split(separators, StringSplitOptions.RemoveEmptyEntries);
double firstInPair = 0.0;
for (int i = 0; i < parts.Length; i++ )
{
    double number = double.Parse(parts[i]);
    if (i % 2 == 0)
    {
        firstInPair = number;
        continue;
    }
    double secondInPair = number;
    // do whatever you want with the pair (firstInPair, secondInPair) ...
}