문제

텍스트 파일에 저장한 색상 정보를 가져온 다음 해당 색상을 라벨의 전경색으로 사용하려고 합니다.하지만 런타임에 버튼을 클릭하면 오류 메시지나 기타 내용이 표시되지 않습니다.내가 가진 코드는 다음과 같습니다.

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+?)

내가 이해하는 한, 위의 작은 정규식은 다음을 의미합니다."캐리지 리턴과 개행 문자를 찾은 다음 하나 이상의 숫자를 찾으되 욕심을 부리지 마세요."그렇죠?

누군가 저를 도와주세요.매우 감사합니다.

메모:텍스트 파일에 저장된 색상 정보는 음수(ARGB 색상)입니다.

-16744193

파일 내용은 다음과 같습니다.

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

설명:

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

따라서 정규식은 작동하고 다른 모든 세부 정보는 올바르게 가져오지만 색상 정보는 가져오지 못합니다.

도움이 되었습니까?

해결책

당신의 regex입니다 ~ 아니다 문제. Wim이 제공 한 것뿐만 아니라 당신의 성취도는 잘 작동합니다. 따라서 문제는 입력을 처리하는 방식에 있어야합니다.

다음은 시도 할 수있는 몇 가지 사항입니다.

이 숫자를 사용하는 대신 다른 입력으로 실행하십시오.

-16744193

대신 이와 같은 것을 사용하십시오.

100
-100

그런 다음이 줄 뒤에 값을 인쇄합니다.

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

그리고 여기에 게시하십시오. 이렇게하면 문제가 무엇인지 볼 수있는 모든 사람뿐만 아니라 쉽게도 쉬워집니다.

다른 팁

- 일치하지 않습니다 \d. 또한, 당신이 비 그리스도 경기를하는 경우 \d+ Regexp를 만족시키기 때문에 첫 번째 숫자 만 캡처됩니다. regexp를 변경하십시오 (-?\d+) 선택 사항과 일치합니다 - 숫자가 시작될 때, 숫자가있는만큼 많은 숫자, 숫자 (Newline, end-of-string, ...)를 따르는 캐릭터까지까지 (그러나 포함하지 않음).

이 동정인을 시도하고 그것이 작동하는지 확인하십시오.

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

당신의 regex는 "글꼴 크기 값 이후"를 찾고있는 것처럼 보였다.

또한 ArgB 색상은 5가 아닌 그룹 매치 7에 있습니다.

오류가있는 라인에 중단 점을 설정하고 무엇을 볼 수 있습니다. match.Groups[5].Value 정말로.

int로 변환 할 수 없습니다.

다른 곳에서 제안된 대로 일치 값을 인쇄하는 것은 도움이 될 뿐만 아니라 문제를 더 쉽게 격리할 수 있도록 정규 표현식을 줄이는 것도 도움이 됩니다.

하지만 한 가지 더 제안할 수 있습니다.다음은 글꼴 크기 일치로 시작하는 정규식의 마지막 부분입니다.

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

다음과 일치해야 하는 항목

...
14.0
-55794414

글꼴 크기 숫자 일치 직후 개행 일치 항목이 있으므로 14.0 이후에 공백이 있으면 일치가 실패합니다.시도해 보세요

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

후행 공백이 있든 없든 모두 작동해야 합니다.(정규 표현식 엔진에 따라 "\s*" 것보다 나을 수도 있다 "\s*\r\n".)

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

당신은 이미 그 인용문을 알고 있다고 생각합니까?

어떤 사람들은 문제에 직면했을 때 "알다시피, 정기적 인 표현을 사용할 것입니다."라고 생각합니다. 이제 두 가지 문제가 있습니다.

정규 표현식에는 4 개의 그룹이 있지만 빈 문자열이 될 5 ~ 8 그룹에 액세스하려고 시도하고 있으며 int32.parse에 의해 빈 문자열을 정수로 구문 분석 할 수 없습니다.

이 regex를 사용할 수 있습니다.

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

작동하는 것을 볼 수있는 사용 예 :

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);

이 예에서는 REGEX가 색상과 일치하는 것을 볼 수 있듯이 다른 색상의 2 개의 레이블이 있습니다.

Regex의 그룹 :

  • 0: 제어
  • 1: 텍스트
  • 2: x
  • 3: y
  • 4: 폰트
  • 6: 크기
  • 7: 색깔
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top