检查一个字符串是否以另一个字符串或另一个字符串的一部分结尾

本文关键字:字符串 另一个 一部分 结尾 是否 一个 检查 | 更新日期: 2023-09-27 17:55:54

我想知道是否有解决该主题中提到的问题的方法。

例:

在我的项目中,我必须解析很多消息。这些消息包含格式化字符,如 "'n""'r" 。此消息的末尾始终使用作者的姓名进行签名。

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

  • 'r'n'rDaniel Walters'n'r'n
  • 'n'r'n'r'n'rDaniel

或其他东西

问题是我不知道如何识别这些不同的结局。我试图通过在循环中调用string.EndsWith()来仅删除最后"'n'r'n",但此解决方案仅删除除"'r'n'rDaniel Walter"以外的所有内容。然后我尝试删除作者(我在此步骤之前解析了它),但这也不起作用。有时解析的作者是"丹尼尔·沃尔特斯",签名只是"丹尼尔"。

有什么想法可以解决这个问题吗?是否有一些比循环字符串更简单、更智能的解决方案?

检查一个字符串是否以另一个字符串或另一个字符串的一部分结尾

您可以创建一个正则表达式,将名称替换为可选的姓氏,以及前后任意数量的空格字符。

例:

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);
(是的

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

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

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

您必须确定签名"看起来像"什么。是否有始终适用的特定标准?

  • 始终后跟至少 3 个换行符(''r 或 ')
  • 以大写字母开头
  • 没有以下文本

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

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

根据您的需要进行调整。

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

/(['r'n]+['w ]+['r'n]*)(?!.)/
你也可以

这样做,但我不确定你的模式是否改变,但这会返回丹尼尔沃尔特

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

另一种方法是在换行符处拆分消息,删除空的换行符条目。然后重新组装预期的字符串,不包括我假设总是有签名的最后一行。

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