2009-10-02 6 views
0

텍스트 파일에 저장 한 색상 정보를 가져 오려고 시도하고 해당 색상을 레이블의 forecolor로 사용하려고합니다. 하지만 런타임에 버튼을 클릭하면 오류 메시지가 표시됩니다. 내가 가진 코드는 아래 있습니다 :ARGB 색상과 일치하는 정규식 (-44830298)

MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)""\r\n(\d+?)"); 
     foreach (Match match in lines) 
      int color = Int32.Parse(match.Groups[5].Value); 

다른 정보 여관 파일에 대해서도 다른 정규 표현식을 가지고 있지만 다른 정규 표현식은 문제가 아닙니다. 문제는 내가 방금 색상 (argb)와 일치하도록 추가 한 정규식입니다. 이 문자열의 끝에서입니다 :

\r\n(\d+?) 

그래서 지금까지 내가 그것을 이해, 위의 작은 정규식 것은 이것을 의미한다 "는 캐리지 리턴과 줄 바꿈 한 후 1 개 이상의 숫자를 찾기하지만 욕심 해달라고". 그게 맞습니까?

누군가 나를 도와주세요. 고마워요.

참고 :

Control 
Control Text 
Control Location 
Control Font Name 
Control Font Size 
Control Font Color 

설명 :

-16744193 

파일의 내용은 다음과 같이이다 : 텍스트 파일에 저장되는 색 정보는 (ARGB 색상) 음수입니다

Label 
"this is a label" 
23, 77 
Tahoma 
14.0 
-55794414 

그래서 정규 표현식이 작동하지만 다른 모든 세부 정보를 올바르게 가져 오지만 색상 정보를 얻지 못합니다. 에.

+1

match.Groups [5] .Value를 콘솔에 쓰면 무엇을 출력합니까? – ChaosPandion

+0

입력 한 샘플로 질문을 업데이트하고 일치하는 것을 보여주십시오. 지금은 정규 표현식이 당신이 말하는 그룹의 수를 지원하지 않습니다. –

답변

1

귀하의 정규식 하지 문제입니다. Wim에서 제공 한 정규식은 물론 정상적으로 작동합니다. 문제는 입력이 처리되는 방식과 관련이 있습니다.

여기에 몇 가지 당신이 시도 할 수 있습니다 : 다음

100 
-100 

: 대신이 같은

-16744193 

사용 무언가 : 다른 입력, 즉 대신이 번호를 사용하여와

실행이 다음 행의 값을 인쇄하십시오.

int fcolor = Int32.Parse(match.Groups[7].Value); 

그리고 그것이 무엇인지보십시오.

당신이해야 할 또 다른 시간을 절약 것은

match.Groups[1].Value 
match.Groups[2].Value 
match.Groups[3].Value 
match.Groups[4].Value 
match.Groups[5].Value 
match.Groups[6].Value 
match.Groups[7].Value 
match.Groups[8].Value 

에서 프린트 아웃 값이며, 여기를 게시 할 수 있습니다. 이렇게하면 문제가 무엇인지 알 수있을뿐만 아니라 모든 사람들이 당신을 위해 쉽게 할 수 있습니다.

+0

감사합니다 aditya –

+0

괜찮 았는데! 기꺼이 도와 줬어. –

0

정규 표현식에 4 개의 그룹 만 있지만 그룹 5에서 8까지는 빈 문자열이되고 Int32.Parse는 빈 문자열을 정수로 구문 분석 할 수 없습니다.

1

오류가있는 행에 중단 점을 설정하고 match.Groups[5].Value이 실제로 무엇인지 확인합니다.

저는 int로 변환 할 수 없습니다.

+0

나는 double float 문자열을 시도했다. 나는 심지어 커피를 시도했지만 그 라인의 어떤 것도 변환하지 못했다. ( –

7

-\d과 일치하지 않습니다. 또한 \d+에서 욕심없는 일치를 수행하는 경우 정규 표현식을 만족하므로 첫 번째 숫자 만 캡처됩니다. 정규식을 (-?\d+)으로 변경하여 숫자 시작 부분에있는 - (선택 사항)과 일치하는 숫자를 입력하십시오 (줄 바꿈, 줄 끝, 줄 바꿈, 줄 바꿈 등).).

+0

@Wim. 감사합니다. 나는 그것을 업데이트했으나 행운이 없다. 정규식은 내가 지금있다 : @ \ (\ d \) \ r \ n ([\ "\] \ n" ") \ r \ n (\ d + \. \ d +) ""\ r \ n (-? \ d +) "--- 코드를 system.drawing.color로 변환해야합니다 : int fcolor = Int32 –

+0

그리고 마지막 \ r \ n 앞에 ""가 있습니다. ",". ",". " (\ d +), \ s (\ d +) \ r \ n ([\ "\"\ n " s] *) \ r \ n (\ d + \. \ d +) \ r \ n (결과는 그룹 7에 있습니다.) – Stormenet

+0

감사합니다. @Stormenet,하지만 여전히 일하고 싶지 않아 :(모든 아이디어? –

6

이 정규 표현식을 사용해보고 올바르게 작동하는지 확인하십시오. (\ d \), \ s (\ d +) \ r \ n ([\ w \ s)] ] *) \ 연구 \ n (\ D + \ D +) \ 연구 \ n을 (-.? 당신의 정규식이 찾고있는 것으로 보였다

\ D +)은 "글꼴 크기 값 이후 또한

, 당신. ARGB 색상은 5가 아닌 그룹 일치 7이됩니다.

당신이 정규식 사용할 수 있습니다
+0

@baeltazor RegexBuddy에서이 코드를 테스트했으며 샘플을 예상대로 각 그룹의 일치 항목과 일치시킵니다. – WDuffy

0

: 수 있듯이, 우리는 다른 색상으로 2 개 레이블이이 예에서

string value = @"Label 
""this is a label"" 
23, 77 
Tahoma 
14.0 
-55794414 
Label 
""this is a label"" 
23, 77 
Tahoma 
14.0 
-55794415"; 

MatchCollection lines = Regex.Matches(
value, 
@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)"); 
var colors = new List<int>(); 
foreach (Match match in lines) 
{ 
    colors.Add(Int32.Parse(match.Groups[7].Value)); 
} 

CollectionAssert.AreEquivalent(new[] { -55794414, -55794415}, colors); 

:

@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)" 

작동하는지 볼 수있는에서 사용 예제 정규식이 색상과 일치하는 것을 볼 수 있습니다. 정규식의

그룹 :

  • 0 : 제어
  • 1 : 텍스트
  • 2 : X
  • 3 : Y
  • :
  • 6 글꼴
  • : 크기
  • 7 : 컬러
1

다른 곳에서 제안한대로 일치 값을 인쇄하면 도움이 될뿐만 아니라 정규 표현식을 줄이면 문제를 쉽게 분리 할 수 ​​있습니다.

하지만 한 가지 더 제안 할 수 있습니다.

..."(\d+\.\d+)\r\n(-?\d+)" 

당신이 줄 바꿈에 대한 경기를 가지고 있기 때문에 즉시 글꼴 크기의 경기 후

... 
14.0 
-55794414 

에 일치하도록되어 다음은 글꼴 크기 일치에서 시작하는 정규 표현식의 마지막 부분입니다 14.0 이후에 공백이 있으면 일치하지 않습니다. 로 및 후행 공백없이 모두 작동해야하는

..."(\d+\.\d+)\s*\r\n(-?\d+)" 

으로 시도 . (정규 표현식 엔진에 따라 "\s*""\s*\r\n"보다 우수 할 수 있습니다.)

실제로 잘못 될 수있는 다른 많은 것들이 있습니다. 일반적으로 문자열을 분할하고 더 작은 정규식으로 작업하는 것이 더 쉽습니다.

인용문을 이미 알고 있다고 생각해도 되겠습니까? 문제에 직면했을 때

어떤 사람들은, "나는, 내가 정규 표현식을 사용합니다 알고있다."생각 이제 그들은 두 가지 문제가 있습니다.

+0

자세한 답변을 부탁드립니다. 개인적으로, 나는 Regex를 결코 좋아하지 않았다. 하지만 S/O에 관한 사람들이 그것을 사용하도록 조언을 받았습니다. 나는 너의 충고를 지금 시험 중이다. 고마워요 :) –

+0

저는 regexps를 좋아합니다. 프로그래밍 페이지를 한 줄로 바꿀 수 있다는 점에서 편리합니다. 물론, 한 페이지의 잠재적 버그도 얻을 수 있습니다. 실제로, 저는 여러분의 크기만큼 정규 표현식을 포기하고, 너무 많은 시간을 들여 디버깅을합니다. 귀하의 경우에는 먼저 줄을 나누고 값마다 하나의 정규식을 사용합니다. 그런 식으로 다루기가 더 쉬워진다. 행운을 빌어 요 :) –