【问题标题】:How to make this regex allow spaces c#如何使这个正则表达式允许空格 c#
【发布时间】:2012-07-19 03:36:25
【问题描述】:

我有一个带有以下正则表达式的电话号码字段:

[RegularExpression(@"^[0-9]{10,10}$")]

这会检查输入是否正好是 10 个数字字符,我应该如何更改此正则表达式以允许空格以使以下所有示例都有效

1234567890
12 34567890
123 456 7890

干杯!

【问题讨论】:

  • 你确定这是正确的正则表达式吗?这看起来更像是一个电子邮件验证器

标签: c# regex


【解决方案1】:

这行得通:

^(?:\s*\d\s*){10,10}$

解释:

^ - start line
(?: - start noncapturing group
\s* - any spaces
\d - a digit
\s* - any spaces
) - end noncapturing group
{10,10} - repeat exactly 10 times
$ - end line

这种构造这个正则表达式的方式也是相当可扩展的,以防你不得不忽略任何其他字符。

【讨论】:

  • 顺便说一句,\s 将匹配任何空格,而不仅仅是空格字符。 OP 可能想要匹配任何空格,但他确实说“空格”。
  • @Michael Graczyk - 好点; \s 确实会匹配各种类型的空间(不确定是否全部,比如零宽度空间和其他花哨的空间)。如果只允许其中一些,比如只允许按空格键获得的 ` ` 字符,可能会将它们列为 [ ]* 或 ` *` 而不是 \s*
  • 谢谢尤金,解释也不错
  • 此解决方案将空格计为 10 个字符的一部分。使用纯正则表达式方法仅计算数字更加困难和混乱。
  • @Dominic Cronin - 事实上,它计算了(?:)\s*\d\s* 的组。稍作修改,它就可以计算任何其他组。目前,一组只包含一个数字,这给出了 10 个组,每组 1 个数字和未知数量的未知类型的空白。
【解决方案2】:

使用这个:

^([\s]*\d){10}\s*$

我作弊了 :) 我刚刚在这里修改了这个正则表达式:

Regular expression to count number of commas in a string

我测试过。对我来说效果很好。

【讨论】:

    【解决方案3】:

    根据您的问题,您可以考虑使用匹配评估器委托,如http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchevaluator.aspx 中所述

    这将使计算数字和/或空格的问题变得简单

    【讨论】:

      【解决方案4】:

      我认为是这样的^\d{2}\s?\d\s?\d{3}\s?\d{4}$

      有变体:10 位或 2 位空格 8 位或 3 位空格 3 位空格 4 位。

      但如果您只想要这 3 个变体,请使用类似的东西

      ^(?:\d{10})|(?:\d{2}\s\d{8})|(?:\d{3}\s\d{3}\s\d{4})$
      

      【讨论】:

        【解决方案5】:

        使用这个简单的正则表达式

        var matches = Regex.Matches(inputString, @"([\s\d]{10})");

        编辑

        var matches = Regex.Matches(inputString, @"^((?:\s*\d){10})$");
        

        解释:

           ^             the beginning of the string
        
          (?: ){10}      group, but do not capture (10 times):
        
          \s*            whitespace (0 or more times, matching the most amount possible)
        
          \d             digits (0-9)
        
          $              before an optional \n, and the end of the string
        

        【讨论】:

        • 不,[\s\d]{10} 不起作用 - 它需要 10 个字符,其中一些是空格,一些是数字。
        • @Ria 你没有很好地测试你的代码。 Console.WriteLine(Regex.Match(new string(' ', 10), @"([\s\d]{10})").Success); 肯定会打印出true
        • 仍然错误:Console.WriteLine(Regex.Match(new string('0', 11), @"((?:\s*\d){10})").Success); 打印 true。您需要检查字符串的开头和结尾。请参阅尤金的回答。
        猜你喜欢
        • 2012-10-09
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2015-03-19
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        相关资源
        最近更新 更多