c# - 检查字符串的开头和结尾是否包含特殊字符
问题描述
我想检查一个字符串是否以特殊字符开头或结尾。
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);
}
现在我想检查字符串开头或结尾是否存在特殊字符,别无他法。
解决方案
只需要稍作调整:
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 很可能是一个微优化
推荐阅读
- unity3d - Unity - 弹丸运动,找到击中坐标 x,y 所需的角度
- html - 使用 CSS 设置 font-size 以使每个等宽字符精确 x/window.width
- c++ - 使用 devtoolsets-8-gcc 构建 Boost 失败?
- keras - keras 和输入和损失的形状
- r - 整理数据集
- html - gap 属性表明它在 MDN 上不受支持。使用安全吗?
- flutter - 在抽屉小部件中使用时,输入字段隐藏在键盘下方
- monaco-editor - Monaco JavaScript 编辑器 - 如何更改智能感知位置以显示在线下方?
- python - 通过 gspread 和 google sheet API 更改 google sheet 中的列格式
- java - Maven在构建子项目时从jar依赖中解包类