条件正则表达式匹配基于两个非捕获组

时间:2017-05-23 04:30:36

标签: php regex preg-match

我一直在寻找几个小时,我找不到解决方案。我的正则表达式技巧很糟糕,但我确信有知识的人会很容易。

/^(?:[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

2 个答案:

答案 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

Pattern Demo

改进:

  • 合并分支机构
  • 使用\d代替[0-9]以简化
  • 用于简洁/效率的字符类[GT]

如果你要和Andreas一起去&#39;模式,我推荐这个:

/^(?:\d{1,3} ?GB)|(?:\d{1,2}(?:\.\d{1,2})? ?TB)$/i

改进:

  • 添加了锚点
  • 使用非捕获组
  • 使用\d代替[0-9]以简化
  • 使用代替\s提高效率
  • 为了准确性/效率而逃过.
  • 为TB分支制作小数可选