首页 > 解决方案 > 正则表达式 - 排除数字之间的“-”

问题描述

在 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,,,"

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

标签: phpregexpreg-match

解决方案


您可以使用

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

请参阅正则表达式演示

细节

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

推荐阅读