C# 使用正则表达式检查输入字符串中的无效字符
我有下面的代码片段,其中我正在检查一个名称中的无效字符,当用户输入无效字符(允许的字符在regex中定义)时,将返回falseC# 使用正则表达式检查输入字符串中的无效字符,c#,C#,我有下面的代码片段,其中我正在检查一个名称中的无效字符,当用户输入无效字符(允许的字符在regex中定义)时,将返回false 问题是:只要用户在行尾输入无效字符,如果用户在ItMeNo之间输入任何无效字符,即将游标移回ITEMNITY中的某个位置,则允许写无效字符,即返回真值,而false应该返回。 我在定义正则表达式时犯了什么错误?还是其他错误?谢谢 bool validName = true; Regex regex = new Regex(@"[a-zA-Z0-9_-]+$"); if
问题是:只要用户在行尾输入无效字符,如果用户在ItMeNo之间输入任何无效字符,即将游标移回ITEMNITY中的某个位置,则允许写无效字符,即返回真值,而false应该返回。 我在定义正则表达式时犯了什么错误?还是其他错误?谢谢
bool validName = true;
Regex regex = new Regex(@"[a-zA-Z0-9_-]+$");
if (regex.IsMatch(ItemName, 0) == false) validName = false;
if (!validName)
{
return false;
}
else
{
return true;
}
如果有什么不清楚的地方,请告诉我
编辑:我把我的正则表达式从(@“[a-zA-Z0-9_-]+$”)改为(@“^[a-zA-Z0-9_-]*$”),它成功了。我是否犯了任何明显的错误,或者这是正确的解决方案 更改您正在使用的正则表达式以
Regex regex = new Regex(@"[^.*?(?=[\^#%&$\*:<>\?/\{\|\}]).*$");
Regex Regex=new Regex(@“[^.*(?=[\^%&$\*:\?/\{\\\\\}]).*”;
这将检查字段中的无效字符您需要在正则表达式的开头添加一个锚定符“^[a-zA-Z0-9_-]+$” 您的正则表达式将遇到无效字符,然后开始尝试在下一个字符处再次匹配(成功) 以您的正则表达式为例:
ItemName ="abc!def";
Regex regex = new Regex(@"[a-zA-Z0-9_-]+$"); // Not modified
var result = Regex.IsMatch(ItemName, 0);
首先,正则表达式将匹配尽可能多的字符类,因为+
是贪婪的:
*--- Start of match.
"abc!def"
^--- Regex engine matched up to here.
模式的下一部分是$
锚点或字符串结尾(在此上下文中)。这与“!”不匹配,因此正则表达式开始尝试在下一个字符处再次匹配
它同样需要尽可能多的角色类:
*--- Start of match
"abc!def"
^--- Regex engine here.
它再次检查下一个字符是否是字符串的结尾(即它的结尾)。因此,会找到一个匹配('def'),并且IsMatch
返回true
通过将^
(字符串开头)锚添加到开头,可以阻止这种情况发生
仅供参考,您的整个方法可以缩短为:
Regex regex = new Regex(@"^[A-Z0-9_-]+$", RegexOptions.IgnoreCase);
return regex.IsMatch(ItemName);
编辑:
甚至只是:
return Regex.IsMatch(ItemName, @"^[A-Z0-9_-]+$", RegexOptions.IgnoreCase);
您的正则表达式看起来很好。将
+
更改为*
也将允许处理空字符串,并且在开始时追加^
将确保完整字符串是否适用于此模式。感谢您的帮助,但不知怎的,我不得不只列出有效字符,或者您可以说我不想列出无效字符演员。