检查一个字符串是否以另一个字符串或另一个字符串的一部分结尾
本文关键字:字符串 另一个 一部分 结尾 是否 一个 检查 | 更新日期: 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);