热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正则表达式恰好匹配5个数字和一个可选空格

如何解决《正则表达式恰好匹配5个数字和一个可选空格》经验,为你挑选了3个好方法。

我最近需要创建一个正则表达式来检查Javascript中的输入.输入可以是5或6个字符长,并且必须包含正好5个数字和一个可选空格,它们可以是字符串中的任何位置.我根本不是正则表达式,即使我尝试寻找更好的方法,我最终得到了这个:

(^\d{5}$)|(^ \d{5}$)|(^\d{5} $)|(^\d{1} \d{4}$)|(^\d{2} \d{3}$)|(^\d{3} \d{2}$)|(^\d{4} \d{1}$)  

这就是我需要的,所以允许的输入是(如果0是任何数字)

'00000'  
' 00000'  
'0 0000'  
'00 000'  
'000 00'  
'0000 0'  
'00000 '

我怀疑这是与正则表达式实现这种匹配的唯一方法,但我还没有找到一种更清洁的方法.所以我的问题是,如何更好地编写?

谢谢.

编辑:
所以,这是可能的!Tom Lord的回答用正则表达式做了我需要的,所以我把它标记为我的问题的正确答案.

然而,在我发布这个问题后不久,我意识到我的想法不对,因为项目中的每个其他输入都很容易用正则表达式"验证",我立即假设我也可以用它来验证这个.

事实证明我可以这样做:

const validate = function(value) {
    const v = value.replace(/\s/g, '')
    const regex = new RegExp('^\\d{5}$');
    return regex.test(v);
}  

谢谢大家的精彩答案和想法!:)

Edit2:我忘了提一个可能非常重要的细节,即输入是有限的,所以用户最多只能输入6个字符.我很抱歉.



1> Tom Lord..:

注意:使用正则表达式来解决此问题可能不是最佳答案.如下所述,用简单的函数计算数字和空格可能更容易!

但是,由于问题是要求正则表达式的答案,并且在某些情况下,您可能被迫使用正则表达式解决此问题(例如,如果您被绑定到某个库的实现),以下答案可能会有所帮助:

此正则表达式匹配包含正好5位数的行:

^(?=(\D*\d){5}\D*$)

此正则表达式匹配包含一个可选空格的行:

^(?=[^ ]* ?[^ ]*$)

如果我们将它们放在一起,并确保字符串包含数字和空格([\d ]*$),我们得到:

^(?=(\D*\d){5}\D*$)(?=[^ ]* ?[^ ]*$)[\d ]*$

您也可以使用[\d ]{5,6}而不是[\d ]*在该模式的末尾,达到相同的效果.

演示

说明:

这个正则表达式使用前瞻.这些是零宽度模式匹配器,这意味着模式的两个部分都"锚定"到字符串的开头.

\d表示"任何数字",\D表示"任何非数字 ".

means "space", and [^ ]意思是"任何非空间 ".

\D*\d被重复5次,以确保5位数字组成是的字符串中.

以下是正则表达式的可视化:

正则表达式可视化

请注意,如果您确实希望"可选空间"包含选项卡之类的内容,那么您可以改为使用\s\S.


更新:由于这个问题似乎已经引起了很大的关注,我想澄清一下这个答案.

我上面的答案有几个"更简单"的变体解决方案,例如:

// Only look for digits and spaces, not "non-digits" and "non-spaces":
^(?=( ?\d){5} *$)(?=\d* ?\d*$)

// Like above, but also simplifying the second lookahead:
^(?=( ?\d){5} *$)\d* ?\d*

// Or even splitting it into two, simpler, problems with an "or" operator: 
^(?:\d{5}|(?=\d* \d*$).{6})$

上面每行的演示:1 2 3

或者,如果我们可以假设字符串不超过6个字符,那么即使这样就足够了:

^(?:\d{5}|\d* \d*)$

因此,考虑到这一点,为什么您可能希望使用原始解决方案,以解决类似的问题?因为它是通用的.再看看我的原始答案,用自由间距重写:

^
(?=(\D*\d){5}\D*$) # Must contain exactly 5 digits
(?=[^ ]* ?[^ ]*$)  # Must contain 0 or 1 spaces
[\d ]*$            # Must contain ONLY digits and spaces

这种使用连续预测的模式可以在各种场景中使用,以编写高度结构化(并且可能令人惊讶地)易于扩展的模式.

例如,假设规则已更改,您现在想要匹配2-3个空格,1 .和任意数量的连字符.实际上很容易更新正则表达式:

^
(?=(\D*\d){5}\D*$)       # Must contain exactly 5 digits
(?=([^ ]* ){2,3}[^ ]*$)  # Must contain 2 or 3 spaces
(?=[^.]*\.[^.]*$)        # Must contain 1 period
[\d .-]*$   # Must contain ONLY digits, spaces, periods and hyphens

......因此,在总结,有 "简单"的正则表达式的解决方案,并很可能更好的非正则表达式的解决方案OP的具体问题.但我提供的是一种通用的,可扩展的设计模式,用于匹配这种性质的模式.


方式太复杂了.在6个月内容易被误读或混淆.如果需求发生变化,太难改变.

2> le_m..:

我建议首先检查五个数字,^\d{5}$或者预测^(?=\d* \d*$)六个字符之间的数字之间的单个空格.{6}$.

结合这些部分表达式得出^\d{5}$|^(?=\d* \d*$).{6}$:

let regex = /^\d{5}$|^(?=\d* \d*$).{6}$/;

console.log(regex.test('00000'));   // true
console.log(regex.test(' 00000'));  // true
console.log(regex.test('00000 '));  // true
console.log(regex.test('00 000'));  // true
console.log(regex.test('  00000')); // false
console.log(regex.test('00000  ')); // false
console.log(regex.test('00  000')); // false
console.log(regex.test('00 0 00')); // false
console.log(regex.test('000 000')); // false
console.log(regex.test('0000'));    // false
console.log(regex.test('000000'));  // false
console.log(regex.test('000 0'));   // false
console.log(regex.test('000 0x'));  // false
console.log(regex.test('0000x0'));  // false
console.log(regex.test('x00000'));  // false


3> 小智..:

这对我来说似乎更直观,而且是O(n)

function isInputValid(input) {
    const length = input.length;
    if (length != 5 && length != 6) {
        return false;
    }

    let spaceSeen = false;
    let digitsSeen = 0;
    for (let character of input) {
        if (character === ' ') {
            if (spaceSeen) {
                return false;
            }
            spaceSeen = true;
        }
        else if (/^\d$/.test(character)) {
            digitsSeen++;
        }
        else {
            return false;
        }
    }

    return digitsSeen == 5;
}


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
author-avatar
济南谷幽兰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有