gpt4 book ai didi

javascript - 正则表达式精确匹配 5 个数字和 1 个可选空格

转载 作者:行者123 更新时间:2023-12-02 23:00:30 30 4
gpt4 key购买 nike

我最近需要创建一个正则表达式来检查 JavaScript 中的输入。输入的长度可以是 5 或 6 个字符,并且必须恰好包含 5 个数字和 1 个可选空格,该空格可以位于字符串中的任何位置。我根本不精通正则表达式,尽管我尝试寻找更好的方法,但我最终得到了这个:

(^\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个字符。抱歉。

最佳答案

Note: Using a regular expression to solve this problem might not be the best answer. As answered below, it may be easier to just count the digits and spaces with a simple function!

However, since the question was asking for a regex answer, and in some scenarios you may be forced to solve this with a regex (e.g. if you're tied down to a certain library's implementation), the following answer may be helpful:

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

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

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

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

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

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

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

Demo

说明:

此正则表达式使用 lookaheads 。这些是零宽度模式匹配器,这意味着模式的两个部分都“锚定”到字符串的开头。

  • \d 表示“任何数字”,\D 表示“任何非数字”。

  • 表示“空格”,[^ ] 表示“任何非空格”。

    <
  • \D*\d 被重复 5 次,以确保字符串中正好有 5 个数字。

以下是正则表达式实际运行的可视化:

regex visualisation

请注意,如果您确实希望“可选空间”包含制表符之类的内容,那么您可以使用 \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*)$

考虑到这一点,为什么您可能想要使用原始解决方案来解决类似的问题?因为它是通用。再看看我原来的答案,用free-spacing重写:

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

可以使用这种使用连续前瞻的模式 in various scenarios ,编写高度结构化且(也许令人惊讶)易于扩展的模式。

例如,假设规则发生更改,您现在想要匹配 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 的特定问题。但我提供的是一个通用的、可扩展的设计模式,用于匹配这种性质的模式。

关于javascript - 正则表达式精确匹配 5 个数字和 1 个可选空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44462355/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com