2017-12-29 87 views
2

한 파일에 포함 된 단어를 대체하기 위해 다른 텍스트 파일을 사전 (구조체 : Key sep :: tab value)으로 사용하여 코드를 만들고 싶습니다.C# RegEx와 사전을 사용하여 "전체 단어 만"바꾸기

현재 코드 : 지금까지

var fileDictionary = new Dictionary<string, string> 
    File.ReadLines(dictionaryPath, Encoding.Default) 
    .Select(line => line.Split(' ')) 
    .ToDictionary(data => data[0], data => data[1]), StringComparer.InvariantCultureIgnoreCase);//create dictionary based on text file 

for (int i = 0; i < rowNumber; i++) 
{ 
    var output = fileString[i].ToString();// current row, taked from other file 
    var replaced = Regex.Replace(output, String.Join("|", fileDictionary.Keys.Select(Regex.Escape)), m => fileDictionary[m.Value], RegexOptions.IgnoreCase); 
    var result = replaced.ToString(); 
    outputFile += result.ToString(); 
    outputFile += "\r\n"; 
} 

, 다 내가 사전에 수집 된 단어를 대체하기 위해 정규식을 사용하고, 잘 작동,하지만 난 "전체 단어 만"유형을 대체하는 문제가있다.

내가 좋아하는 패턴을 사용하기로 결정 @ "\ bsomeword \ B"하지만 아래에 설명 된대로 나는 그것을 구현하는 경우 :

var replaced = Regex.Replace(output, String.Join("|", 
     String.Format(@"\b{0}\b", 
     fileDictionary.Keys.Select(Regex.Escape))), 
     m => fileDictionary[m.Value], RegexOptions.IgnoreCase); 

코드는 결과가 반환되지 않습니다. 최종 텍스트 파일은 원본 파일과 유사합니다. 아무 반응이 없습니다. 나는 실제로 키를 변경하는 패턴을 사용할 때 문제가 사전 키에 있고 새로운 것이 현재 사전에 존재하지 않는다는 것을 알고 있습니다. 따라서 키가 존재하지 않으면 값은 대체되지 않습니다.

아무에게도 제안 사항을 수정하는 방법이 있습니까? 아니면 누군가 RegEx와 사전을 사용하여 전체 단어 만 바꾸는 다른 방법을 알고 있을까요? 패턴도 더 효율적으로 될 것이다 당신의 출력을위한 모두 StringBuilder를 활용하여 사전

var replaced = Regex.Replace(fileString, String.Join("|", fileDictionary.Select(m => @"\b" + Regex.Escape(m.Key) + @"\b")), m => fileDictionary[m.Value], RegexOptions.IgnoreCase); 

에서 제대로 분석하지 것처럼

+0

대신 패턴으로'\ w *'을 사용해보십시오. '\ b {0} \ b'의 패턴은 정확히 의미가 없습니다. 단어 경계 문자를 정확히 0 번 찾아서 다른 단어 경계 문자를 찾습니다. –

+0

"[^] \ w + [ $.!?] "코드는 공백이나 문자열의 시작 부분을 수락하고 끝 부분에 공백, 문자열 끝, 물음표, 느낌표 또는 마침표를 받아들입니다. – jdweng

+0

내 패턴과 jdwng의 차이점을 지적하기 위해 광산은 "[sales]"의 "sales"와 일치하지만 그의 것은 그렇지 않습니다. 선택한 패턴은 실제 요구 사항을 기반으로합니다. –

답변

1

는 것 같습니다.