2011-04-12 4 views
1

텍스트 파일의 숫자 문자열 목록을 대체해야합니다. 문자열이 다른 숫자 문자열의 일부인 경우에는 교체가 안 : 문자열 교체가 : 111,111 교체 문자열 :Regex.Replace - 긴 문자열의 일부인 문자열 건너 뛰기

inputText = Regex.Replace(inputText, "(?<![0-9])" + stringToMask + "(?<![0-9])", "####MASKED####"); 

이 코드 :

Text file: 
111111 
111111.text text 
text text111111 text text 
a111111 
2111111 
111111a 
1111112 
a111111a 

Expected result: 
MASKED 
MASKED.text text 
text textMASKED text text 
aMASKED 
2111111 -> Character 2 prevents masking 
MASKEDa 
1111112 -> Character 2 prevents masking 
aMASKEDa 

을 마스크 내 코드입니다 모든 것을 건너 뛰고 마스킹을 수행하지 않습니다.

+2

해야 둘째되지 수 - 앞서 부정적인 모습 (<[0-9]?!) ([0-9]?!)? – sh54

+0

무슨 sh54가 말했다. 그는 표를받을 가치가있다. – sehe

+0

@Henk, 아니야. '\ D'는'[^ 0-9]'가됩니다. '!'는 assertion 뒤의 look ('? stema

답변

1

MatchEvaluator http://www.dotnetperls.com/regex-replace을 사용하면 대치 조건을 수행 할 수 있습니다. 프리폼 교체 여부를 결정하려면 일치하는 첫 번째 및 마지막 문자를 추가하고이 패턴으로 문자열을 분할하고 첫 번째 및 마지막 기호를 분석 할 수 있습니다. 내가 제대로 문제를 이해한다면

+0

또한 Regexp.Escape를 패턴에 추가하면 내부에 특수 기호가 포함될 수 있습니다. – varela

+0

대체에 대한 유효성 검사를 추가하기 때문에이 문제를 조사하고있었습니다. 존재가 대체 액션을 억제 할 사전 정의 된 문자열 목록을 갖고 싶습니다. 예를 들어, 문자열 "amount = 111111"에서 'amount ='를 사용하면 일치가 중지되어야합니다. 나는 당신이 게시 한 예와 몇 가지 다른 것들을 보았고 그것을 어떻게 할 수 있는지 이해하지 못했습니다. 델리게이트는 경기를 치르기 때문에 그 전에 오는 경기를 확인할 수 없습니다. – Yoav

+0

Regex.Replace (inputText, ".?"+ stringToMask + ".?", "#### MASKED ####")를 사용하십시오. 구걸과 마지막에는 1 개의 여분의 기호로 필요한 것을 얻을 수 있습니다. 11111에 의해 문자열을 나눌 수 있기 때문에 첫 번째 항목은 첫 번째 기호가되고 두 ​​번째 - 마지막 것입니다. 파싱을 마칠 때 첫 번째와 마지막 심볼을 대체 문자열에 추가해야합니다. – varela