我有以下代码片段,我在其中检查无效字符的名称,并在用户输入无效字符时返回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_- ] * $")并且它有效。我正在做任何明显的错误,或者这是正确的解决方案吗?
答案 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(@"[^.*?(?=[\^#%&$\*:<>\?/\{\|\}]).*$");
这会检查你字段中的无效字符