【问题标题】:How do I not allow special characters, but allow space in regex?如何不允许特殊字符,但在正则表达式中允许空格?
【发布时间】:2013-12-04 18:49:12
【问题描述】:

当用户在 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 语句,应该允许。

如何让它允许空格,但不允许特殊字符?

谢谢,

【问题讨论】:

    标签: c# regex


    【解决方案1】:

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

    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 之前使用 not 运算符 !,例如:

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

    但是如果你想在你的正则表达式中写一个被排除的字符组,你可以在你的组中放置一个^。当^ 位于[^] 组内时,它后面的任何字符都将被排除在匹配之外。

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

    如果这是您正在寻找的内容,您可以将您的声明更改为:

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

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

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

    【讨论】:

    • 感谢您的精彩解释,但是当我使用上述正则表达式时,字符串“2”怎么会落在 if 语句中?
    • 再次感谢您的回答,并对那个愚蠢的问题感到抱歉:D
    【解决方案2】:
    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);
    

    【讨论】:

      【解决方案3】:

      你可以包括所有的数字、字符串和空格:)

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

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

      【讨论】:

      • 如果它的 BoNCoDiGo 会失败
      • @Aniket 更多地关注包含数字和字符串的空格,而不是真正的大写;)因为 OP 已经知道他的问题本身的 CASE。
      • 我希望[\d+] 的意思不是“一位或多位数字”。
      • @KennethK。你的评论字面意思是什么意思?
      • @bonCodigo 看来您打算[\d+] 表示“一位或多位数字”,但事实并非如此。如果这不是你的意思,那么我的立场是正确的,但它会违反 OP 的“特殊字符”要求。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2018-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多