0

トピックに記載されている問題の解決策があるかどうかを知りたいと思っていました。

例:

私のプロジェクトでは、多くのメッセージを解析する必要があります。"\n"これらのメッセージには、や などの書式設定文字が含まれています"\r"。このメッセージの末尾には、常に作成者の名前が署名されています。

ここで、各メッセージから署名を削除したいと思います。問題は、メッセージの最後が次のようになることです。

  • \r\n\rDaniel Walters\n\r\n
  • \n\r\n\r\n\rDaniel

または、他の何か

問題は、これらのさまざまな結末を特定する方法がわからないことです。"\n\r\n"ループを呼び出して最後の のみを削除しようとしstring.EndsWith()ましたが、このソリューションは 以外のすべてを削除するだけ"\r\n\rDaniel Walter"です。次に、作成者を削除しようとしました (このステップの前に解析しました) が、これも機能しません。解析された作成者が「Daniel Walters」で、署名が「Daniel」のみである場合があります。

これを解決する方法はありますか?文字列をループするよりも簡単でスマートなソリューションはありますか?

4

5 に答える 5

1

正規表現を作成して、名前をオプションの姓、および前後の任意の数の空白文字に置き換えることができます。

例:

string message = "So long and thanks for all the fish  \t\t\r Arthur \t Dent  \r\r\n  ";
string firstName = "Arthur";
string lastName = "Dent";

string pattern = "\\s+" + Regex.Escape(firstName) + "(\\s+" + Regex.Escape(lastName) + ")?\\s*$";

message = Regex.Replace(message, pattern, String.Empty);

(はい、それは本当にイルカがそれを言っていたのを私は知っています。)

于 2013-01-23T19:42:47.307 に答える
1

次のようなものを試すことができます(テストされていません):-

string str="\r\n\rDaniel Walters\n\r\n";
while(str.EndsWith("\r") || str.EndsWith("\n"))
{
  // \r and \n have the same length. So, we can use either \r or \n in the end
  str=str.SubString(0,str.Length - ("\r".Length));
}
while(str.StartsWith("\r") || str.StartsWith("\n"))
{
  // \r and \n have the same length
  str=str.SubString("\r".Length,str.length);
}
于 2013-01-23T19:43:32.423 に答える
1

署名が「どのように見えるか」を判断する必要があります。常に適用される特定の基準はありますか?

  • 少なくとも 3 つの改行が常に続く (\r または \n)
  • 大文字で始まる
  • 次のテキストがありません

このような正規表現は、これらの基準で機能する可能性があります。

/[\r\n]{3,}[A-Z][\w ]+[\r\n]*(?!\w)/

必要に応じて調整してください。

追加するために編集: これはドキュメントの最後の「段落」と一致する必要があります。

/([\r\n]+[\w ]+[\r\n]*)(?!.)/
于 2013-01-23T19:48:31.370 に答える
0

あなたもこれを行うことができますが、あなたのパターンが変わるかどうかはわかりませんが、これは Daniel Walter を返します

string replaceStr = "\r\n\rDaniel Walters\n\r\n";
replaceStr = replaceStr.TrimStart(new char[] { '\r', '\n' });
replaceStr = replaceStr.TrimEnd(new char[] { '\r', '\n' });

または、トリムメソッドを使用する場合は、次のことができます

string replaceStr = "\r\n\rDaniel Walters\n\r\n";
replaceStr = replaceStr.Trim();
于 2013-01-23T19:47:13.367 に答える
0

別のアプローチは、メッセージを改行文字で分割し、空の改行エントリを削除することです。次に、署名が常にあると想定する最後の行を除いて、予想される文字列を再構築します。

string removeLastLine = "Text on the firstline\r\ntest on second line\rtexton third line\r\n\rDaniel Walters\n\r\n";
string[] lines = removeLastLine.Split(new char[] {'\r', '\n'},  StringSplitOptions.RemoveEmptyEntries);
lines = lines.Take(lines.Length - 1).ToArray();
string result = string.Join(Environment.NewLine, lines);
于 2013-01-23T19:41:58.883 に答える