问题描述
字符串的最大长度为5(包括一个字母)。 如果没有字母,则允许的数字长度为4。
允许的数字: 0
至9999
允许使用一个字母(仅当字符串至少包含一个数字时)。 一些例子:
允许:
1a
,a2
,1111a
,1a22
,9999
不允许:
99999
,11111
,a
,aa
我试过了:
^(?:[0-9]|[a-z](?=[^a-z]*$)){1,5}$
这适用于情况: 1a
, a2
, 1111a
, 1a22
, 9999
。
但是它也错误地允许99999
。
对如何限制数字长度有帮助吗?
1楼
^(?:(?=\d*[a-z]\d*$)(?=.*[0-9])(?:[a-z0-9]){1,5}|[0-9]{1,4})$
试试看。看演示。
2楼
正如您所发现的,正则表达式并不擅长记录事物。 在这种情况下,先行检查将使您正确:
^\d{1,4}$|^(?=\d*[a-z]\d*$)[a-z\d]{1,5}$
我们首先使用^\\d{1,4}$
来获得最简单的情况。
如果失败,则第二种选择,第二种选择接管。
它要做的第一件事是使用(?=\\d*[az]\\d*$)
断言字符串中确实有一个字母。
如果前瞻成功,则匹配位置返回到字符串的开头,这使我们可以再次匹配整个字符串,这次是[az\\d]{1,5}$
。
此时,实际上并不需要验证其余字符是否为数字。
我本可以使用(?=[^az]*[az][az]*$
。我们只需要确保它可以查看整个字符串即可。我只是认为\\d*
更具自记录性。
请注意,此正则表达式将匹配仅包含字母的字符串。
如果要确保至少还有一位数字,请将最后的{1,5}
更改为{2,5}
。
这是 。
3楼
使用{size}
限制正则??表达式中String的长度。
我更新了正则表达式:
^(?:(?=.*[a-z])(?:[0-9]|[a-z]){1,5}|[0-9]{4})$