.net 从字符串中提取数字

.net 从字符串中提取数字,.net,string,c++-cli,string-matching,pathgeometry,.net,String,C++ Cli,String Matching,Pathgeometry,我必须解析一个字符串来创建一个字符串。字符串由由comas和/或(任何)空格(如换行符、制表符等)分隔的数字组成,数字也可以使用科学符号书写 这是一个例子:“9.63074,9.63074-5.55708e-0060,0 1477.78” 这些点是:P1(9.63074,9.63074),P2(-0555708,0),P3(01477.78) 要提取数字,我使用正则表达式: Dim RgxDouble作为新的正则表达式(“[+-]?\b[0-9]+(\[0-9]+)?(e[+-]?[0-9]+)

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

这是一个例子:
“9.63074,9.63074-5.55708e-0060,0 1477.78”

这些点是:P1(9.63074,9.63074),P2(-0555708,0),P3(01477.78)

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

Dim RgxDouble作为新的正则表达式(“[+-]?\b[0-9]+(\[0-9]+)?(e[+-]?[0-9]+)?\b”)
将匹配项设置为MatchCollection=RgxDouble.Matches(.Value)
将PSegmentColl设置为新的PathSegmentCollection
将P图形变暗为新路径图形
火柴
如果.Count<2或LSE.Count Mod 2 0,则退出Sub
PFigure.StartPoint=新点(.Item(0).Value、.Item(1).Value)
对于i As UInteger=2到.Count-1步骤2
尺寸x为双精度=.Item(i).Value,y为双精度=.Item(i+1).Value
PSegmentColl.Add(具有{.Point=New Point(x,y)}的新线段)
下一个
以

它可以工作,但我必须解析大约十万(或更多)个字符串,这样做太慢了。我想找到一个更有效的解决方案,然而:大多数情况下,数字都不是用科学记数法编写的,如果您认为这是一种更好的方法,那么我可以使用用C++/CLI编写的程序集,该程序集使用C/C++非托管代码或C#不安全代码。

您为什么要自己解析这些代码?这是一件复杂的事情,也许是未来需要改变(至少是扩展)的主题。WPF可以为您做到这一点:,因此最好让框架工作


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

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) ...
}
char[]分隔符=新的char[]{'',','};//只能创建一次
var parts=pattern.Split(分隔符、StringSplitOptions.RemoveEmptyEntries);
双第一空气=0.0;
对于(int i=0;i你应该添加你感兴趣的语言的标签——我不认为很多人跟踪“字符串”作为话题,而很多人遵循C,VB或C++(或者你认为与你的问题相关的任何其他语言)。完成(.NET和C++ +CLI是相关的),谢谢。顺便说一下,<代码> -5.55 708E-06< <代码>不是< >代码> 0555708代码/代码>它是
-000000555708
,因为它不是路径标记语法。这只是一个数字序列,解析方法无法解析我的字符串。但是如果我改变字符串,也许它会工作,我必须测试它。@gliderkite:嗯,字符串不是来自某个路径描述吗?如果没有,请尝试在字符串前面加上“L”,这样它将是一个有效的路径。我必须在第一个字符中插入“M”,在第二个数字后面插入“L”,在最后一个字符中插入“z”。有什么想法吗?我决定现在就用这个解决方案。然而,这:
MyPathGeometry.AddGeometry(Geometry.Parse(MyString)
是我的新应用程序瓶颈。我必须找到一个或另一个替代时间。@gliderkite:关于瓶颈的问题。