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

您必须确定签名的“外观”。是否有始终适用的特定标准?

  • 总是后跟至少 3 个换行符(\r 或 \n)
  • 以大写字母开头
  • 没有以下文字

像这样的正则表达式可能适用于这些标准:

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

根据您的需要进行调整。

编辑添加:这应该匹配文档的最后一个“段落”。

/([\r\n]+[\w ]+[\r\n]*)(?!.)/
于 2013-01-23T19:48:31.370 回答
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 回答
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 回答