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+?)
내가 이해하는 한, 위의 작은 정규식은 다음을 의미합니다."캐리지 리턴과 개행 문자를 찾은 다음 하나 이상의 숫자를 찾으되 욕심을 부리지 마세요."그렇죠?
누군가 저를 도와주세요.매우 감사합니다.
메모:텍스트 파일에 저장된 색상 정보는 음수(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: 색깔