首页 > 解决方案 > 检查字符串的开头和结尾是否包含特殊字符

问题描述

我想检查一个字符串是否以特殊字符开头或结尾。

string a = "%test1*";
string b ="%test2";
string c ="test3%";
string d = "te!st";

bool aResult = ContainsSpecialChars(a);
bool bResult = ContainsSpecialChars(b);
bool cResult = ContainsSpecialChars(c);
bool dResult = ContainsSpecialChars(d);

在上面的示例中,前三个字符串以特殊字符开头或结尾。d 字符串包含介于两者之间的特殊字符。如果我使用以下函数,它将为所有这些示例返回 true。

 private bool ContainsSpecialChars(string value)
        {
            var list = new[] { "~", "`", "<", ">", "!", "?", ";", ":", "|", "{", "}", "[", "]", "@", "#", "$", "%", "^", "*", "(", ")", "+", "=", "\"" };
            return list.Any(value.Contains);
        }

现在我想检查字符串开头或结尾是否存在特殊字符,别无他法。

标签: c#

解决方案


只需要稍作调整:

return list.Any(e => value.StartsWith(e) || value.EndsWith(e));

FWIW 我不会将方法称为“ContainsSpecial ..”我会称之为“StartsOrEndsWithSpecial ...”

顺便说一句,如果您使用核心,您可能会认为没有列表而只使用字符串看起来更整洁,因为字符串可以被视为 IEnumerable 字符,并且 Starts/EndsWith 方法接受一个字符(在.NET 核心):

var chars = "~`<>!?;:|{}[]@#$%^*()+=\"";

return chars.Any(c => value.StartsWith(c) || value.EndsWith(c));

这种方式仅限于单个字符;你的第一种方法在概念上可以让“特殊字符”成为一个字符序列,但是因为你的第一个列表中的所有字符串的长度都只有 1,看起来你的意图是让它只是单个字符。如果您使用的是 .net 框架,您仍然可以通过以下方式利用它:

var list = "~ ` < > ! ? ; : | { } [ ] @ # $ % ^ * ( ) + = \" ".Split();

如果您经常这样做(在数百万个字符串上使用此辅助方法),我可能会将 this/yourlist设为类级别变量,这样您就不会一直创建它


您也可以通过避免 LINQ 的方式执行此操作:

var chars = "~`<>!?;:|{}[]@#$%^*()+=\"";

return chars.IndexOf(value[0]) > -1 || chars.IndexOf(value[value.Length-1]) > -1;

我觉得它不太可读,但它的基本要素是相同的——这种方式要求“这些开始/结束字符是这个字符列表中的任何一个”,另一种方式是询问“这个列表的字符是出现在此字符串的开头/结尾的任何字符”;同一根棍子的不同末端,并且 indexof route 很可能是一个微优化


推荐阅读