2012-04-07 14 views
1

문자열을 구문 분석하여 PathSegmentCollection을 만들어야합니다. 이 문자열은 혼수 상태 및/또는 (공백 문자, 탭 등의) 공백으로 구분 된 숫자로 구성되며 숫자는 과학 표기법을 사용하여 작성할 수도 있습니다. 문자열에서 숫자 추출

은 예이다 : "9.63074,9.63074 -5.55708e-006 0 ,0 1477.78"

그리고 포인트는 숫자 I를 추출 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/C++를 사용하는 C++/CLI로 작성된 어셈블리를 사용할 때 아무런 문제가 없습니다. 관리되지 않는 코드 또는 C#의 안전하지 않은 코드

+2

관심이있는 언어로 태그를 추가해야합니다. 많은 사람들이 "문자열"을 주제로 추적하지 않는다고 생각하지만 많은 사람들이 C# , VB 또는 C++ (또는 귀하의 질문과 관련 있다고 생각되는 다른 언어). – assylias

+0

완료되었습니다 (.NET 및 C++/CLI와 관련성 있음). 감사합니다. – gliderkite

+0

그런데'-5.55708e-006'는'-0,555708'이 아니며'-000000555708'입니다. – Vlad

답변

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) ... 
} 
+0

경로 마크 업 구문이 아니기 때문에 그것은 단지 일련의 숫자 일뿐입니다. Parse 메소드는 문자열을 파싱 할 수 없습니다. 하지만 아마도 그것이 작동 할지도 모른다 문자열을 변경하면, 나는 그것을 테스트해야합니다. – gliderkite

+0

@gliderkite : 음, 일부 경로 설명에서 나오는 문자열이 아닙니까? 그렇지 않은 경우 문자열에 "L"을 추가하여 유효한 경로가되도록하십시오. – Vlad

+0

첫 번째 문자로 'M'을, 두 번째 숫자 뒤에 'L'을, 마지막 문자로 'z'를 삽입해야합니다. 어떤 생각? – gliderkite