2012-06-11 4 views
1

전역 설정을 사용하지 않으려합니다 (.NET에서 사용하도록 기본값으로 설정 됨). 문자열의 첫 번째 부분 만 변경하면됩니다. 그것이 내가 공의의 첫 번째 인스턴스를 변경에만Regex에 대해 전역 사용 안 함

C00000WPF0000SAND

을 기원 예를 들어, 문자열에 두 번 발생 될 가능성. 이것은 내가 현재 그 일을하고 어떻게

if (Regex.IsMatch(text, "^[a-z]+00+", RegexOptions.IgnoreCase)) 
{ 
    text = Regex.Replace(text, "0{1,}", "00*", RegexOptions.IgnoreCase); 
} 

그러나 이것은 "00+"의 모든 단일 인스턴스를 가지고 그것을 변경하는 것 같다하지만이 일을 망쳐 놨어요.

답변

3

일치 제한을 지정해야합니다. Regex.Replace(string, string, RegexOptions)의 설명서는 발견 된 패턴의 모든 인스턴스를 바꿉니다. Regex.Replace의 정적 오버로드는 일치 제한과 정규식 옵션을 모두 사용하므로 Regex 개체를 구성한 다음 Replace(string, string, int) 오버로드를 사용해야합니다. 이것을 시도하십시오 :

text = new Regex("0{1,}", RegexOptions.IgnoreCase).Replace(text, "00*", 1); 
+0

+1 나를 망치고 다음 번에 빨리 입력해야합니다. :) – KazR

+0

대단히 감사합니다. 가능한 한이 답변을 수락합니다. –

2

정규식을 약간 변경하여 원하는 패턴과 일치시키고 첫 번째 0 세트 만 바꿀 수 있습니다. 또한 IsMatch 전화를 끊는 데 도움이됩니다.

사용할 수있는 패턴이다 : 그것은 문자열의 시작과에서 의도 한대로 경기가 발생할 수 있도록 숨김 보면, (?<=^[a-z]+)하는 사용을 제외하고 (?<=^[a-z]+)00+

이 패턴은, 첫 번째 것과 유사 편지. look-behind의 사용은 일치하지만 소비하지는 않으므로 대체가 문자열의 해당 부분에 영향을 미치지 않습니다.

string text = "C00000WPF0000SAND"; 
text = Regex.Replace(text, "(?<=^[a-z]+)00+", "00*", RegexOptions.IgnoreCase); 
Console.WriteLine(text); 
0

또 다른 해결책은 다음과 같습니다

text = Regex.Replace(text, "(?i)^([a-z]+)00+", "${1}00*"); 

어떤 경우는 전혀 if 필요하지 않습니다.