2013-05-05 5 views
0

직렬 포트 통신을 통해 문자열로 데이터를 수신하고 있습니다. 그 부분은 잘 작동합니다. 데이터의 형식은 다음과 같습니다regex를 사용하여 C에서 문자열의 특정 값 추출 #

Distance run: 36in. 
Direction in degrees: 275 

Total of person founds:11 
New Person found in: 
Lat/Long: 18.38891, -66.12174 
Date: 5/4/2013 Time: 19:13:35.0 

Total of person founds:12 
New Person found in: 
Lat/Long: 18.38891, -66.12175 
Date: 5/4/2013 Time: 19:13:37.0 


Distance run: 15in. 
Direction in degrees: 215 

Total of person founds:13 
New Person found in: 
Lat/Long: 18.38891, -66.12174 
Date: 5/4/2013 Time: 19:13:39.0 


Distance run: 30in. 
Direction in degrees: 180 

그러나 이것은 또 다른 거리 실행이있을 수있다 (위도/경도, 날짜와 시간에 그것을 위치 포함) 명 세운 각 블로그의 사이에 약간의 원인을 달라질 수 있습니다 및도 단위의 방향.

정규 표현식을 사용해 보았지만 사용법에 대해서는 잘 모릅니다. 심지어 숫자 만 추출하는 정규식도 있습니다.

var xnumbers = Regex.Split(strFileName, @"[^0-9\.\-]+").Where(c => c != "." && c.Trim() != ""); 

내가 원하는 것은 거리를 달리게하는 것의 특정 값을 추출하는 것입니다. 첫 번째 값은 36 인치이며이를 저장합니다. 그런 다음 방향의 값을도 단위로 가져 와서 다른 변수에 저장하고 마지막으로 & 위도를 가져 와서 다른 변수에 저장하십시오. 나중에이 데이터를 사용하여 그래프를 그리기 위해 List를 작성하려면이 값이 필요합니다. 이미 드로잉 부분이 있습니다. 나는이 후두둑 알고

해당 거리가이 개 숫자 아니라 고려 걸리지 만 그 값이 1 개 또는 3 개의 숫자가 될 수 있습니다 (예 : 거리를 실행 : 1 인치 또는 거리를 실행 : 219)를

나는이 시도
string pattern = @"^Distance Run:(?<distance>.{2}),Direction in degrees:,(?<degress>. {3}),Lat/Long:(\+|\-)(?<latlong>.{18})$"; 

string distance = string.Empty; 
string degrees = string.Empty; 
string latlong = string.Empty; 


Regex regex = new Regex(pattern); 

if (regex.IsMatch(strFileName)) // strFileName is the string with the data 
{ 
    Match match = regex.Match(strFileName); 
    foreach (Capture capture in match.Groups["distance"].Captures) 
     distance = capture.Value; 
    foreach (Capture capture in match.Groups["degree"].Captures) 
     degrees = capture.Value; 
    foreach (Capture capture in match.Groups["Lat/Long"].Captures) 
     latlong = capture.Value; 
} 

하지만 작동하지 않습니다. 나는 어떤 도움과 충고에 감사 할 것입니다. 미리 감사드립니다.

+1

나는 당신이 정규식의 캐주얼 사용을 넘어 추진하고있다 생각합니다. 대신 자신의 파서를 굴리기를 고려 했습니까? 문법은 충분히 간단하며 간단한 구문 분석은 모든 개발자의 툴킷에 있어야하는 기술입니다. –

+0

작업을 수행하기위한 예제 코드를 제공해 주시겠습니까 ?? 미리 감사드립니다. – user2352673

+0

Fermat에게 사과드립니다 : 나는 당신에게 그것을 선물 할 수있는 완벽하고 우아한 수단을 발견했습니다. 불행히도이 주석의 여백은 너무 작아서 포함 할 수 없습니다. –

답변

2

{} 내에 2 개의 값을 전달하여 변수 반복을 정의 할 수 있습니다. \d{1,3}은 1-3 자리와 일치합니다. 형식 주어진

그러나 전반적으로, 나는 아마이 적은 정규 표현식을 사용하는 것은, 구문 분석 오히려 좋은 : 모든

  • 먼저 내가 문자열의 배열로 모든 라인을 통해 루프를 것입니다.
  • 한 줄이 비어 있으면 무시하고, 연속 된 두 줄이 비어 있으면 새 데이터 집합이 만들어집니다.
  • 줄에 :이 있으면 그 줄을 나눕니다. 왼쪽 부분이 키가되고 오른쪽 부분이 값이됩니다.
  • 행에 :이 포함되어 있지 않으면 무시되거나 오류 플래그가 발생합니다 (예외가 발생하거나 예외가 발생 함).
  • 그런 다음 "키"의 의미를 결정하기 위해 간단한 문자열 일치 (정규식보다 빠름)를 사용할 수 있습니다.
  • 또 다른 정규식 (또는 Double.Parse()과 같은 것)은 오른쪽에서 값을 추출합니다. 이 변환 함수는 단순히 유효하지 않은 문자를 건너 뛰고 그 뒤에 오는 문자는 모두 삭제합니다.
  • 더 복잡한 항목 (좌표 또는 시간 소인 또는 항목이 중요한 항목)은 간단한 정규 표현식을 사용하여 구문 분석 될 수 있습니다.

간체 코드 (/ compileable 올바른 반드시 100 %) :

String[] lines = fileContents.Split({'\n'}); // split the content into separate lines 

bool wasEmpty = false; 
foreach (String line in lines) { 
    line = line.Trim(); // remove leading/trailing whitespaces 
    if (line.Length == 0) { // line is empty 
     if (wasEmpty) { // last line was empty, too 
      // init a new dataset 
     } 
     else 
      wasEmpty = true; 
     continue; // skip to next entry 
    } 
    wasEmpty = false; 
    String content = line.split({':'}); // split the line into a key/value pair 
    if (content.Length != 2) // not exactly two entries 
     continue; // skip 
    // content[0] now has the "key" (like "Lat/Long") 
    // content[1] now has the "value" (like "18.38891, -66.12175") 
    // both can be evaluated using regular expressions 
} 
+0

코드 예제를 줄 수 있습니까 ?? – user2352673

+0

몇 가지 예제 코드를 추가했습니다. – Mario

+0

지난 밤에 나는이 일을하고 있었지만 100 % 일하지 않았습니다. 처음에 if = 0을 입력하고 연산을 잘 수행합니다. 그런 다음 아무것도 비교하지 않고 i를 증분하고 다시 평가하면 다른 사람에게로 가야합니다. 이번에는 입력 할 때 첫 번째 else에 입력한다고 가정합니다. 어떠한 제안?? (distance [i] == "Distancia recorrida") {var num = Regex.Split (distance.ElementAt (i + 1)) : – user2352673

2

정규 표현식에서 두 번째 부분의 이름은 degress입니다. 코드에서 대신 degree을 사용하고 있습니다.

정규 표현식에서 두 번째 부분의 이름은 latlong입니다. 코드에서 대신 Lat/Long을 사용하고 있습니다.

아니요, 그렇다면이 두 그룹을 얻을 수 없습니다.

+0

스페인어에서 영어로 번역 할 때 오타가 잘못되었습니다. 코드가 정확합니다. – user2352673

관련 문제