>

다른 텍스트 파일을 사전 (struct .: Key sep.:tab Value)으로 사용하여 한 파일에 포함 된 단어를 바꾸는 코드를 만들고 싶습니다.

현재 코드 :

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";
}

지금까지 모든 것이 제대로 작동했지만, RegEx를 사용하여 사전에 수집 된 단어를 바꾸고 있지만 "전체 단어 만"유형을 바꾸는 데 문제가 있습니다.

@ "\ 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);

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

어떻게 제안 할 사람이 있습니까? 아니면 누군가 정규식과 사전을 사용하여 단어 전체를 대체하는 다른 방법을 알고 있습니까?


  • 답변 # 1

    패턴이 사전에서 올바르게 구문 분석되지 않은 것 같습니다

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

    출력을 위해 StringBuilder를 사용하는 것이 더 효율적입니다.

관련 자료

  • 이전 javascript - reactjs - 구성 요소에서 동적으로 생성 된 요소 표시/숨기기
  • 다음 postgresql - postgres - 역할 생성 및 psql -u 역할로 로그인