【问题标题】:Regular Expression only digits and blank spaces正则表达式只有数字和空格
【发布时间】:2014-02-13 11:37:26
【问题描述】:

我有一个文本输入,我要求它只接受数字 (0-9) 和空格 (" ")。 验证此输入的当前正则表达式是:

/((\d{1,})(\s{1,})?){1,}/

代表:一个或多个组基于一个或多个数字的第一组和一个或多个空格的可选第二组

这只会让我介绍以下值:999999(仅数字)或" "(仅空格)或91 08 8510 903(数字和空格的混合)。 但实际上,我也可以插入aaa或其他字符。

【问题讨论】:

  • space 字符?还是允许使用所有空白字符,例如 tab...?
  • 您可以简单地使用+,而不是{1,}。意思相同。
  • 你想要一个允许数字和空格的正则表达式对数字和空格有任何限制吗?
  • 只有空格字符,没有制表符或其他字符。没有限制

标签: javascript regex validation


【解决方案1】:

解剖

您的正则表达式不只接受字母:

/((\d{1,})(\s{1,})?){1,}/.test('aaa') // false

实际上,如果输入包含至少一个数字,则任何字符都可以接受:

/((\d{1,})(\s{1,})?){1,}/.test('a1a') // true

话虽如此,让我们从你的模式中剔除脂肪:

"{1,}" equals "+"   -> ((\d+)(\s+)?)+
"(.+)?" equals ".*" -> ((\d+)\s*)+
useless brackets    -> (\d+\s*)+

此结果可以翻译为:“一个或多个数字 (\d+) 后跟零个或多个空格 (\s*)、一个或多个 (()+)、输入中的任何位置”。或者,我们可以说:“至少一个数字,输入中的任何位置”。

您需要将“输入中的任何位置”替换为“从输入的开头到结尾”。以下特殊字符允许这样做:^(输入开始)和$(输入结束)。让我们做一堆测试,看看它们是如何工作的:

requirement                                 regex     input   .test()
---------------------------------------------------------------------
must contain at least one digit             /\d+/     'a1a'   true  
must start with at least one digit          /^\d+/    '1a'    true  
must start with at least one digit          /^\d+/    'a1'    false 
must end with at least one digit            /\d+$/    '1a'    false 
must end with at least one digit            /\d+$/    'a1'    true  
only digits from the beginning to the end   /^\d+$/   '1a1'   false

建议

只有可能被一个空格分隔的数字:/^\d+( \d+)*$/

^         beginning of the input
\d+       a digit, one or more times
( \d+)*   a whitespace + same as above, zero or more times
$         end of the input

使用示例:

var r = /^\d+( \d+)*$/;
var isValid = r.test(' 1 ');  // false
var isValid = r.test('1 1');  // true
var isValid = r.test('1  1'); // false

更多关于正则表达式:http://www.javascriptkit.com/javatutors/redev.shtml.

【讨论】:

    【解决方案2】:

    试试这个

    $pattern = '/^[0-9 ]+$/';
    
      if ( preg_match ($pattern, $text) )
      {
       echo 'allowed';
      }
    

    【讨论】:

    • 将其标记为正确答案,以便将来对其他人有所帮助。
    • 不起作用。此输入:“04 06 09880”,作为无效返回。
    • 当一个正则表达式的答案以“试试这个...”开头时,你就知道它会失败:-)
    【解决方案3】:

    试试这个正则表达式

    /(\d+\s*\d*)+$/
    

    在此处可视化结果http://regex101.com/r/dE5uR8

    我已经使用在线测试过

    http://regexpal.com/

    上述正则表达式将不接受开头的空白空格。您至少需要一位数。如果您想匹配开头的空格,请将其更改为 (\d*\s*\d*)+$ ,这也将接受空格

    【讨论】:

    • 哪里失败了?你能提供一些细节吗?
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2011-11-14
    • 2022-11-14
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多