2013-01-23 48 views
0

我想知道是否有解决主题中提到的问题的方法。检查一个字符串是否以另一个字符串或另一个字符串的一部分结尾

例子:

在项目中,我必须分析大量信息。这些消息包含格式化字符,如"\n""\r"。 此消息的结尾始终使用作者的姓名签名。

现在我想从每条消息中删除签名。问题是,在邮件的末尾可能看起来像

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

或别的东西

的问题是,我不知道该怎么identifiy这些不同的结局。 我试图通过在循环中调用string.EndsWith()来删除最后的"\n\r\n",但此解决方案仅删除除"\r\n\rDaniel Walter"之外的所有内容。 然后我试图删除作者(我在此步骤之前解析它),但这也不起作用。有时被解析的作者是“Daniel Walters”,签名只有“Daniel”。

任何想法如何解决这个问题? 有没有比在字符串中循环更简单更智能的解决方案?

+0

喜欢在帖子中包含签名/称呼的讽刺,询问如何删除它们,从而证明您不能“修复用户”。他们太破碎了。 – Servy

+0

Skadier你现在使用哪些代码来做这个解析,你可以展示你已经试过的东西..? – MethodMan

+0

它与讽刺Servy无关。我必须为我的期末考试课程的报纸更换这些签名。不幸的是,我们正在使用的平台没有提供任何功能来做到这一点,我不想手动执行此操作(我们有超过1000条消息带有“错误”签名) – TorbenJ

回答

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); 
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); 

(是的,我知道这是真正的海豚这么说。)

+0

我会试试这个。第一眼看上去很有希望。 – TorbenJ

+0

而不是使名称可选,您可以只有'(firstname | lastname)'并执行'RemoveAll',这样即使没有名字的姓氏也会被删除。 – Servy

0

你可以尝试类似如下(未经测试): -

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); 
} 
+0

我做了类似的事情,但不仅有签名。在签名之前有更多的文本。所以这不起作用,但感谢您的解决方案。 – TorbenJ

+0

请注意,这只是'TrimEnd'的低效版本。 – Servy

0

你可以这样做的很好,但我不知道,如果你的格局的变化,但是这将返回丹尼尔·沃尔特

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(); 
1

你必须要确定什么是“看起来像”的签名。是否有具体的标准始终适用?

  • 总是伴随着至少3个换行符(\ r或\ n)的
  • 开始用大写字母
  • 已经没有了下文

像这样的正则表达式可能会为这些标准工作:

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

根据自己的需要进行调整。

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

/([\r\n]+[\w ]+[\r\n]*)(?!.)/ 
+0

不幸的是,它变化很大,不幸的是我发现它很晚,但感谢这个例子。 – TorbenJ

+0

这实际上并不奏效,前瞻需要调整。但它会让你开始。在进行文本处理时,您需要确定您想要匹配和使用它们的独特特征。 – Derek

+0

你也可以用这样的东西切掉每一页的最后一段。 – Derek

相关问题