【问题标题】:Regex - exclude "-" between numbers正则表达式 - 排除数字之间的“-”
【发布时间】:2018-05-17 12:22:33
【问题描述】:

在 php 中,我需要验证来自 textarea 输入的任意数量的正数和/或负数。数字可以是浮点数,并用逗号分隔。

有效:

",,,66,,78.8,-89.8,,0.0,,3.14," or "," or "67,89,10,0876,,"

在 regex101.com 的帮助下,我创建了这个正则表达式

^((-?\d+(\.\d+)?)|(,+))*$

在php中我有这个代码

if (preg_match("/^((-?\d+(\.\d+)?)|(,+))*$/", $text))
{
    echo "yes";
} else 
{
    echo "no";
}

我的问题是,这个正则表达式也验证“-”和额外的“。”数字之间。

这应该是无效的:

",,67.8,89.8787,78-89,-8,07,,33.33.33,,,"

有人可以帮助如何改进这段代码吗?

【问题讨论】:

标签: php regex preg-match


【解决方案1】:

你可以使用

/^,*(-?\d*\.?\d+)?(?:,+\g<1>)*,*$/

请参阅regex demo

详情

  • ^ - 字符串开始
  • ,* - 0+ 逗号
  • (-?\d*\.?\d+)? - 可选捕获组 1 匹配浮点数(注意:如果您不想匹配 .8 像浮点数,可以保留原来的 \d+(?:\d+)?
  • (?:,+\g&lt;1&gt;)* - 0+ 次重复
    • ,+ - 1+ 逗号
    • \g&lt;1&gt; - 捕获组 1 模式(这是一个 subroutine call,等于 (?1),用于重复第一个捕获组子模式)
  • ,* - 0+ 逗号
  • $ - 字符串结束。

【讨论】:

    【解决方案2】:

    我会尝试这样的:

    $my_string = ",,67.8,89.8787,78-89,-8,07,,33.33.33,,,";
    $array = explode(",", $my_string);
    
    foreach ($array as $value){
        if (preg_match("[regex_to_create]", $value))
        {
            echo "yes";
        } else 
        {
            echo "no";
        }
    }
    

    我更喜欢分解字符串,因为正则表达式有时对于长字符串会很棘手。

    【讨论】:

      【解决方案3】:

      您可以在不使用正则表达式的情况下并借助 is_numeric 函数来做到这一点:

      $numbers = array_filter(explode(',', ',,67.8,-89.8787,7889,-8,07,,33.33.33,,,'));
      $validate = true;
      foreach ($numbers as $number) {
          if (!is_numeric($number)) {
              $validate = false;
              break;
          }
      }
      
      var_dump($validate); // false
      

      【讨论】:

        【解决方案4】:

        我将你的正则表达式修改为^(-?\d+(\.\d+)?,?)+$

        现在它将验证字符串,如

        "66,78.8,-89.8,0.0,3.14"
        

        但不是

        ",,,66,,78.8,-89.8,,0.0,,3.14,"
        

        也没有

        "67,89,10,0876,,"
        

        看看这是否适合你的情况。

        这里是测试:https://regex101.com/r/Ivah2H/1

        【讨论】:

          猜你喜欢
          • 2022-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-16
          • 1970-01-01
          • 2020-08-18
          • 2016-07-03
          • 2014-06-26
          相关资源
          最近更新 更多