如何在正则表达式中禁止特殊字符但允许空格?

4

当用户在 datagridview 中输入特殊字符时,我需要填充一个错误信息。目前为止,我有以下内容:

if (Regex.IsMatch(columnValue.ToString(),"^[A-Za-z0-9]$"))
                {
                    MessageBox.Show("You may not use special characters.", "Saving not allowed at this time", MessageBoxButtons.OK, MessageBoxIcon.Error);  

这个正则表达式可以工作,且不允许特殊字符,但是如果字符之间有空格,它会在if语句中失效,而实际上应该被允许。

我该如何使其允许空格,但不允许特殊字符?

谢谢!

5个回答

13

我认为您只是想在正则表达式中添加一个空格:

if (Regex.IsMatch(columnValue.ToString(),"^[ A-Za-z0-9]$"))

编写正则表达式时,通常最好使用原义字符串操作符@,因为许多特殊表达式需要使用反斜杠字符。

if (Regex.IsMatch(columnValue.ToString(), @"^[ A-Za-z0-9]$"))

如果您明确告诉正则表达式在模式中忽略空格,则需要转义空格字符。
if (Regex.IsMatch(columnValue.ToString(), @"^[\ A-Za-z0-9]$", RegexOption.IgnorePatternWhitespace))

如果你希望用户可以使用任何空白字符(空格、制表符、换行符等),你可以使用空白字符类 \s
if (Regex.IsMatch(columnValue.ToString(), @"^[\sA-Za-z0-9]$"))

更新

看起来你可能想要一个不包括某个字符组的正则表达式。

你当前的正则表达式是从字符串开头^到字符串结尾$匹配字符组A-Za-z0-9中的一个。如果想匹配相反的结果,可以在Regex.IsMatch前使用非运算符!,如下所示:

if (!Regex.IsMatch(columnValue.ToString(), @"^[ A-Za-z0-9]$"))

如果你想在正则表达式中排除一些字符,可以在你的字符组中添加一个^。当^出现在一个组[^]中时,它后面的任何字符都将不包括在匹配中。

正则表达式[A-Z]将匹配任何A-Z字符。而正则表达式[^A-Z]将匹配A-Z的任何字符。

如果这就是你要找的内容,你可以将语句改为:

if (Regex.IsMatch(columnValue.ToString(), @"[^A-Za-z0-9\ ]"))

这个语句将匹配任何包含组中不存在字符的字符串。因此,如果输入“Hello World”,它不会匹配。如果输入“Hello!World”,它将匹配,因为“!”不在该组中。

注意:前导的^和尾随的$已被删除。在这个正则表达式中,我们不关心字符串的长度,因为我们只匹配了一个我们没有预期到的字符。


谢谢您的出色解释,但是当我使用上述正则表达式时,为什么字符串“2”会落在if语句中呢? - user1683987
再次感谢您的回答,对于那个愚蠢的问题我很抱歉:D - user1683987

3
if (Regex.IsMatch(columnValue.ToString(),"^[A-Za-z0-9 ]+$"))
{
   MessageBox.Show("You may not use special characters.", "Saving not allowed at this time", MessageBoxButtons.OK, MessageBoxIcon.Error); 
}

或者作为一个单一的布尔检查来测试。
bool isValid = Regex.IsMatch(columnValue, "^[a-z0-9 ]+$", RegexOptions.IgnoreCase);

1

您可以包含所有数字、字符串和空格 :)

"^[a-z]|[A-Z]|[0-9]|[ ]$"

或者

"^[\d+]|[\w+]|[ ]$"

2
这将失败如果它是 BoNCoDiGo。 - Aniket Inge
@Aniket 更多的注意力应该放在数字和字符串之间的空格上,而不是大小写字母的区分 ;) 因为 OP 在他的问题中已经意识到了大小写字母的问题。 - bonCodigo
我希望 [\d+] 不是指“一个或多个数字”。 - Kenneth K.
@KennethK. 你的评论字面上是什么意思? - bonCodigo
@bonCodigo,看起来你打算让[\d+]表示“一个或多个数字”,但实际上它并不是这个意思。如果这不是你的意思,那我就改口说话了,但这将违反OP对“特殊字符”的要求。 - Kenneth K.
更不用说你真的应该使用某种分组来确保 ^$ 能够按照你的意图正常工作 ;) - Kenneth K.

0
在字符类中添加一个空格,即使用^[A-Za-z0-9 ]$而不是^[A-Za-z0-9]$。这仍将禁止其他空格字符,如tab

0
为什么不尝试这个正则表达式:[a-zA-Z0-9\s]+


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接