2011-12-23 3 views
1

C#에서 WinForms와 함께 NET 2.0을 사용하고 있습니다. 나는 정규 표현식에 큰 문제가있다. 간단한 문자열에 4 개 이상의 문자 단어에 콜론을 추가하려고합니다. 콜론을 한 번 추가하면 코드가 더 이상 추가되지 않아야합니다.C# regex - 내 문자열과 일치하지 않습니다.

Regex lbls = new Regex(@"^\s*(?<lbl>[A-Za-z0-9_]{4,})", RegexOptions.Multiline); // Use a regex to obtain all 4 letter words in string 
MatchCollection matches = lbls.Matches(text); // text is my string 

foreach (Match m in matches) 
{ 
    string mm = m.Groups["lbl"].Value; // Matches are stored in this group. 
    if (!Regex.IsMatch(text, @"^\s*\b" + mm + @":\b", RegexOptions.Multiline)) 
    { 
    text = Regex.Replace(text, @"\b" + mm + @"\b", mm + ":", RegexOptions.Multiline); 
    } 
} 

문자열이 "테스트"라고 가정합니다. 즉 출력은 "TEST :"이어야합니다. 그러나 코드를 한 번 더 실행하면 텍스트는 "TEST :"로 유지되어야하지만 그렇지 않으면 "TEST ::"가됩니다. 콜론이 계속 추가됩니다. 왜 이런거야? 내 if 문이 완전히 정확합니다.

답변

1

코드를 처음 실행하면 입력 (단순히 "테스트")에서 "테스트"값을 검색하고이를 "테스트"로 바꾸고 마지막에 콜론을 추가합니다.

따라서 첫 번째 반복 후에 결과는 "테스트 :"가됩니다.

두 번째로 코드를 실행하면 입력 (이제 "TEST :")에서 "TEST"값을 검색하고이를 "TEST"로 바꾸고 마지막에 콜론을 추가합니다.

두 번째 반복 이후 결과는 "TEST ::"가됩니다.

콜론이 없을 때만 콜론을 끝에 추가하려는 것처럼 보입니다 (아마?).

은 ...

if (!Regex.IsMatch(text , @"\b" + mm + @"\b:" , RegexOptions.Multiline)) 
+0

예,하지만 혼란 스럽습니다. 문제가 어디에 있습니까? 또한 "TEST"가 아닌 첫 번째 반복에서 "TEST :"값을 검색하지 않습니까? 검색에 콜론이 있습니다. – david

+0

방금 ​​답변을 업데이트하여 귀하의 의견을 답변했습니다. IF 진술서에서 콜론을 움직이면 필요한 것을 얻을 수 있다고 생각합니다. 희망합니다. –

+0

그래, 고쳐서 지금 문제가 생겼어. 나는 바깥쪽에 바보 같은 실수 대신에 단어 경계 안쪽에 배치했다. 그 점을 지적 해 주셔서 감사합니다. – david

2

^([A-Za-z0-9_]{4})(?!:)을 시도한 후 $1:으로 바꾸십시오. 여기서 $1은 첫 번째 그룹입니다.

+0

이에 "만약"라인을 변경해보십시오? 무슨 뜻인지 잘 모르겠다. – david

+0

정규 표현식은 입력의 처음부터 4 자리의 영숫자를 찾아서 캡처하고 그 뒤에 열이 오는 지 확인합니다. – fge

관련 문제