【问题标题】:How to match numbers ranging from 400 to 550 with regex?如何用正则表达式匹配从 400 到 550 的数字?
【发布时间】:2015-05-05 14:39:28
【问题描述】:

我想验证一个只能包含 400550 范围内数字的数字字符串。

$x = "401";  // valid 
$x = "551";  // invalid 

我只想匹配 400550 之间的数字。

我尝试了以下模式:

if(preg_match_all("/[400-550]+/",$x)); 

但它不起作用。

匹配数字 400-550 的正则表达式模式是什么?

【问题讨论】:

  • 想改用“范围”吗? php.net/manual/en/function.range.php
  • 为什么要通过正则表达式来做?
  • 学习基本的正则表达式语法会有所帮助。 [...] 定义了一个字符类,它匹配目标文本中的单个字符,[400-500] 基本上是说在字符串中找到一个字符是4012 的位置、345。例如[400-500] 在功能上与 [0-5] 相同。
  • 我在这里支持@anubhava - 除非您有特定原因使用正则表达式,否则这看起来有点像 XY 问题 (meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。您似乎在这里真正要问的是如何查找数字是否在数字范围内,至少不要假设您在问题中包含的内容之外的任何内容。

标签: php regex preg-match-all


【解决方案1】:

验证此范围的正则表达式方式:

\b(?:4[0-9]{2}|5[0-4][0-9]|550)\b

demo。由于使用了\b 边界,因此它也适用于较大的文本。如果是整个字符串,请使用^$,而不是\b

【讨论】:

  • Stribiz,谢谢。你的解决方案真的很有帮助。
  • 请随意标记为已接受 :-) 顺便说一句,您的原始正则表达式匹配由 0 到 5 的数字组成的任意长度的数字,因为您将数字放入字符类中。 0-5组成一个范围。
【解决方案2】:

只需将in_array()range() 结合起来,如下所示:

if(!in_array($x, range(400, 550)))
   echo "in ";
echo "valid";

或者只是做一个简单的 if 语句,例如

if($x >= 400 && $x <= 550)

【讨论】:

  • 这样做很诱人,但不要忘记range() 创建了一个数组(包含 150 个项目)。
  • @CasimiretHippolyte 更新了我的答案。如果 OP 想从这个范围中排除某些数字,他可以使用 range() 并从数组中删除数字。
  • 呸!如果他想要这种东西,无论如何也没有人会回答。 :)
  • Rizier ,您的回答是正确的,但我没有要求使用 php 功能的解决方案顺便说一句谢谢您的合作。
  • @Starkeen 不客气! (不是每次都是 OP 想要的解决方案,因为 OP 可能不知道其他东西)
【解决方案3】:

应该可以:

^((4\d\d)|(5([0-4]\d|50)))$

【讨论】:

  • 我认为这里不需要捕获组。我会选择非捕获的。
  • 它可能更快,但捕获组是一种不犯优先级错误的简单方法
  • @Blusky:是的,但你犯了一个优先级错误(即使是捕获组)。锚点与您的主要交替的 2 个分支无关。
  • @Blusky:不是,开始锚点只适用于以 4 开头的数字,结束锚点只适用于以 5 开头的数字。换句话说,模式将以 4000 成功或 1550(因为找到了 ^400 和 550$)
【解决方案4】:

试试这个:

 if(preg_match_all("/(4\d\d|5([0-4]\d|50))/",$x)) { ... }

测试:https://regex101.com/r/zU4vX8/2

【讨论】:

  • 这将匹配到 559
【解决方案5】:

试试/(([4][0-9]{2,2})|([5][0-4][0-9])|(550))/ (我没有测试过)。不知道有没有更简单的方法。

【讨论】:

    【解决方案6】:

    除非您有理由使用正则表达式,否则只需比较数字即可。

    if ($x <= 550 && $x >= 400)
    

    它会比正则表达式或使用数组范围更快、更容易阅读。

    【讨论】:

      【解决方案7】:

      php代码:

      <?php
      $subject = "550";
      $pattern = '/4\d\d|5[0-4][0-9]|550/';
      preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);
      print_r($matches);
      ?>
      

      【讨论】:

      • 501不匹配。
      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 2014-09-27
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多