我一直在寻找几个小时,我找不到解决方案。我的正则表达式技巧很糟糕,但我确信有知识的人会很容易。
/^(?:[1-9]{1,3}GB)|(?:[0-9]{1,2}.[0-9]{1,2}TB)$/i
你可以看到它非常简单。我只需要匹配一个或另一个,但我不知道我哪里出错了。
示例:
<?= $validate->data('100GB'); ?>
这应该匹配,因为它是3位数后跟“GB。”
<?= $validate->data('2.65TB'); ?>
这也应该匹配,因为它是1位数后跟句点,后跟两位数字,然后是“TB”。
编辑:我需要修改数字计数但仍未按预期执行。
对于任何有兴趣的人,这是最终的正则表达式。
/^(?:[0-9]{1,3}(?:GB|TB))|(?:[0-9]{1,2}\.[0-9]{1,2}(?:GB|TB))$/i
答案 0 :(得分:1)
您的正则表达式中没有包含零,这就是模式失败的原因。
[1-9]{3}
只会匹配三位数1-9。所以111是匹配。 234也是一场比赛
但500不是。
使用此正则表达式:([0-9]{3}GB)|([0-9]{1,2}.[0-9]{1,2}TB)
您将能够捕获零,并且它不会将您限制为两位TB磁盘。
https://regex101.com/r/6undez/3
编辑:如果您想匹配100 GB
请注意空格。你可以使用这个正则表达式:
https://regex101.com/r/6undez/4
([0-9]{3}\s?GB)|([0-9]{1,2}.[0-9]{1,2}\s?TB)
答案 1 :(得分:0)
为了提高效率和简洁性(与问题中的最终模式相比),请使用以下模式:
/^(?:\d{1,3}|\d{1,2}\.\d{1,2})[GT]B$/i
改进:
\d
代替[0-9]
以简化[GT]
如果你要和Andreas一起去&#39;模式,我推荐这个:
/^(?:\d{1,3} ?GB)|(?:\d{1,2}(?:\.\d{1,2})? ?TB)$/i
改进:
\d
代替[0-9]
以简化
代替\s
提高效率.