C# 使用正则表达式检查输入字符串中的无效字符

C# 使用正则表达式检查输入字符串中的无效字符,c#,C#,我有下面的代码片段,其中我正在检查一个名称中的无效字符,当用户输入无效字符(允许的字符在regex中定义)时,将返回false 问题是:只要用户在行尾输入无效字符,如果用户在ItMeNo之间输入任何无效字符,即将游标移回ITEMNITY中的某个位置,则允许写无效字符,即返回真值,而false应该返回。 我在定义正则表达式时犯了什么错误?还是其他错误?谢谢 bool validName = true; Regex regex = new Regex(@"[a-zA-Z0-9_-]+$"); if

我有下面的代码片段,其中我正在检查一个名称中的无效字符,当用户输入无效字符(允许的字符在regex中定义)时,将返回false

问题是:只要用户在行尾输入无效字符,如果用户在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);

您的正则表达式看起来很好。将
+
更改为
*
也将允许处理空字符串,并且在开始时追加
^
将确保完整字符串是否适用于此模式。感谢您的帮助,但不知怎的,我不得不只列出有效字符,或者您可以说我不想列出无效字符演员。