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

时间:2014-01-09 11:09:21

标签: c#

我有以下代码片段,我在其中检查无效字符的名称,并在用户输入无效字符时返回false(允许的字符在正则表达式中定义)。

问题是:只要用户在行尾输入无效字符,但是如果用户在ItemName之间输入任何无效字符,即将光标移回ItemName中间某处,则可以正常工作写入无效字符,即返回true,而应该返回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_- ] * $")并且它有效。我正在做任何明显的错误,或者这是正确的解决方案吗?

2 个答案:

答案 0 :(得分:3)

在正则表达式"^[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);

答案 1 :(得分:1)

将正在使用的正则表达式更改为

  Regex regex = new Regex(@"[^.*?(?=[\^#%&$\*:<>\?/\{\|\}]).*$");

这会检查你字段中的无效字符