需要 Regex 只允许 4 位数字和一个字母

Need Regex allowing only 4 digits and one alphabet

字符串的最大长度为 5(包括一个字母)。如果没有字母表,则允许的数字长度为 4。

允许的数字:09999

允许一个字母(仅当字符串至少有一个数字时)。一些例子:

我试过了:

       ^(?:[0-9]|[a-z](?=[^a-z]*$)){1,5}$

这适用于以下情况:1aa21111a1a229999。但它也错误地允许 99999 。 关于如何限制数字长度的任何帮助?

使用 {size} 限制正则表达式中字符串的长度。

我更新正则表达式:

^(?:(?=.*[a-z])(?:[0-9]|[a-z]){1,5}|[0-9]{4})$
^(?:(?=\d*[a-z]\d*$)(?=.*[0-9])(?:[a-z0-9]){1,5}|[0-9]{1,4})$

尝试 this.See 演示。

https://regex101.com/r/fX3oF6/10

正如您所发现的,正则表达式不擅长统计事物。在这种情况下,向前看会让你正确:

^\d{1,4}$|^(?=\d*[a-z]\d*$)[a-z\d]{1,5}$

我们首先使用 ^\d{1,4}$ 来解决最简单的问题。如果失败,第二个选择,第二个选择接管。它做的第一件事是使用 (?=\d*[a-z]\d*$) 断言字符串中只有一个字母。如果前瞻成功,匹配位置 returns 到字符串的开头,允许我们再次匹配整个字符串,这次是 [a-z\d]{1,5}$.

此时确实没有必要验证其余字符是否为数字。我本可以使用 (?=[^a-z]*[a-z][a-z]*$ 代替。我们只需要确保它查看整个字符串。我只是认为 \d* 更适合自我记录。

请注意,此正则表达式将匹配仅包含一个字母的字符串。如果您还想确保至少有一位数字,请将最后的 {1,5} 更改为 {2,5}

这是demo