【解決方法】前にセパレーターがあるテキストから単語を削除する(正規表現またはリストを使用)


テキストから単語を削除し、隣に区切り記号を付ける必要があります。 問題は、プログラムが単語の後に 1 つのセパレーターのみを削除することですが、それらの多くが存在することです。 他のセパレーターを削除する方法はありますか? また、単語が他の文字とつながっていないことを確認する必要があります。 例 (単語が fHouse または Housef の場合、削除しないでください)

現時点で私は持っています:

私が試したこと:

C#
public static void Process(string fin, string fout)
        {
            using (var foutv = File.CreateText(fout)) //fout - OutPut.txt
            {
                using (StreamReader reader = new StreamReader(fin)) // fin - InPut.txt
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        string[] WordsToRemove = { "Home", "House", "Room" };
                        char[] seperators = {';', ' ', '.', ',', '!', '?', ':'};
                        foreach(string word in WordsToRemove)
                        {
                            foreach (char seperator in seperators)
                            {
                                line = line.Replace(word + seperator, string.Empty);
                            }
                        }
                        foutv.WriteLine(line);
                    }
                }
            }
        }

私は持っている :
;;;;;;;;;;,,,,,,,,,, fhgkHouse!House!Dog;;;!!Inside!C!Room!Home!House!Room;;;;;;;;;;!Table!London!Computer!Room;..;

私が得る結果:
;;;;;;;;;;,,,,,,,,,, fhgkDog;;;!!Inside!C!;;;;;;;;;!Table!London!Computer!..;

結果は次のようになります。
fhgkHouse!Dog;;;!!Inside!C!Table!London!Computer!

解決策 1

これが実用的な解決策です:
1.不要な先頭文字をトリミングする
2.不要な単語を削除する
3.不要な単語の末尾にある不要な文字を削除する

C#
using System.Text;

string file = "data.txt";

string[] wordsToRemove = { "Home", "House", "Room" };
char[] seperators = {';', ' ', '.', ',', '!', '?', ':'}; 

string rawText = File.ReadAllText(file);

bool isCapturing = false;
bool isTrimming = false;
int start = -1;

StringBuilder sb = new();

for (int i = 0; i < rawText.Length; i++)
{
    if (start == -1 && char.IsLetterOrDigit(rawText[i]))
    {
        isCapturing = true; // stripping lead junk...
        isTrimming = false;
        start = i;
    }

    if (start == -1 && isCapturing)
    {
        if (isTrimming && rawText[i].Equals('!'))
        {
            isTrimming = false;
            continue;
        }

        if (!isTrimming)
            sb.Append(rawText[i]);
    }

    // tracking a word...
    if (start > -1 && seperators.Contains(rawText[i]))
    {
        if (!wordsToRemove.Any(x => x
                .Equals(rawText.Substring(start, i - start),
                    StringComparison.InvariantCultureIgnoreCase)))

            sb.Append(rawText.Substring(start, i - start + 1));
        else
            isTrimming = true; // trim unwanted characters

        start = -1;
    }
}

Console.WriteLine(sb);

出力:

fhgkHouse!Dog;;;!!Inside!C!Table!London!Computer!

アップデート

@PIEBALDconsult、これはあなたのためだけの正規表現バージョンです…

C#
string file = "data.txt";

string[] wordsToRemove = { "Home", "House", "Room" };

string rawText = File.ReadAllText(file);

string pattern = $"^.*?(?=[a-z])|(?<![a-z])((?=(?:{string.Join("|", wordsToRemove)}))(.*?)(?:\\!|\\z))";

string result = Regex.Replace(rawText, pattern, "", RegexOptions.IgnoreCase);

Console.WriteLine(result);

出力:

fhgkHouse!Dog;;;!!Inside!C!Table!London!Computer!

仕組みの説明については、正規表現とテスト文字列を貼り付けてください regex101: 正規表現のビルド、テスト、およびデバッグ[^]

楽しみ!

コメント

タイトルとURLをコピーしました