2012-01-04 3 views
1

여러 문자열을 확인하고 여러 번 수정해야하므로 (검색 및 다른 일련 번호 바꾸기) 한 문자열이 필요하지만 제대로 작동하지 않습니다. 나는 불변성 때문에 그것을 추측한다.루핑 통역 문자열 - 불변의 문제

private string DoRegexCheck(string line) 
{ 
    string pattern; 

    foreach (string re in this.regexPatterns.Items) 
    { 
    pattern = re; 
    Regex r = new Regex(pattern, RegexOptions.IgnoreCase); 
    line=r.Replace(line, ""); //the line should be updated and the check should continue with updated line 
    }        

    return line; 
} 
+0

이상하게 작동해야합니다. Immunability는 문제가되어서는 안된다 :'Regex.Replace'는 단순히'line' 변수에 할당 될 ** 새로운 ** 문자열 인스턴스를 생성 할 것입니다. * 잘 작동하지 않습니다. * 무엇을 의미합니까? 뭐가 문제 야? –

+0

@Pavel Gatilov : 시퀀스를 대체하지는 않지만 하나씩 시도해도 작동했습니다. – user970696

+0

"내 줄이 바뀌지 않았다"는 뜻이라면 간단히 : 정규식 패턴이 잘못되었습니다. 행을 업데이트하는 코드가 좋습니다. 재생산에 사용할 수있는 샘플 샘플 데이터 (샘플 '줄', 몇 가지 샘플 패턴 및 원하는/실제 출력)를 보여주십시오. –

답변

2

"잘 작동하지 않는다"는 다소 모호합니다.

뜻 경우

는 " line을 변경하지 않습니다 - 그 코드는 괜찮하려고하지 않습니다 같이 우리가 새로운 문자열을 각 Replace (코드로 변경되기 때문에 불변성은 전혀 문제가되지 않습니다. .) 기존의 문자열을 편집 예상대로 업데이트되지 않은 경우, 다음 Regex 패턴이 단순히 잘못된


성능을 의미하는 경우. 당신이 길 문자열에 Regex 작품 변경할 수 없습니다 나는 것을, 그러나 배열을 사전에 컴파일 할 수 있도록 Compiled 옵션을 사용하여 다양한 정규식 캐싱을 제안하십시오. d Regex을 다시 사용하십시오. 이는 수천 개의 line에이를 적용 할 때 특히 중요합니다.

+0

아시다시피, 나는 단지 "line"이라는 문자열이 필요합니다. 각 반복마다 업데이트됩니다. 나는 정규 표현식이 문제가되지 않는다고 생각한다. 액션을 변경하는 다른 문자열과 동일 할 것이다. 반대로 – user970696

+0

@ user970696; 'Regex.Replace' *는 각각'string'을 취하고'string '을 반환하기 때문에'Regex'라는 것이 중요합니다. 다른 API는'char *'또는'StringBuilder'를 취할 수 있습니다. '정규식'은 그렇지 않습니다. 그러나 '문자열'불변성이 문제라는 것을 합치는 것이시기 상조라고 생각합니다. 증상은 무엇입니까? 당신이 우리에게 말한 것은 "잘 작동하지 않는다"입니다. 퍼포먼스를 의미한다면 미리 컴파일하지 않고'Regex'를 처리하는 오버 헤드가'string' 불변성보다 훨씬 커야합니다. 먼저 수정하십시오. –