正则表达式 - 在数字之间排除“-”
Regex - exclude "-" between numbers
在 php 中,我需要验证来自 textarea 输入的任意数量的正数 and/or 负数。数字可以是浮点数,用逗号分隔。
有效:
",,,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,,,"
有人可以帮助改进此代码吗?
您可以使用
/^,*(-?\d*\.?\d+)?(?:,+\g<1>)*,*$/
参见regex demo。
详情
^
- 字符串开始
,*
- 0+ 逗号
(-?\d*\.?\d+)?
- 可选的捕获组 1 匹配一个浮点数(注意:如果你不想像浮点数那样匹配 .8
,你可以保留原来的 \d+(?:\d+)?
)
(?:,+\g<1>)*
- 重复 0 次以上
,+
- 1+ 逗号
\g<1>
- 捕获组 1 模式(这是一个 subroutine call,等于 (?1)
,用于重复第一个捕获组子模式)
,*
- 0+ 逗号
$
- 字符串结尾。
我会尝试这样的事情:
$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";
}
}
我更喜欢展开字符串,因为有时正则表达式对于长字符串可能会很棘手。
我将你的正则表达式修改为 ^(-?\d+(\.\d+)?,?)+$
现在它将验证像
这样的字符串
"66,78.8,-89.8,0.0,3.14"
但不是
",,,66,,78.8,-89.8,,0.0,,3.14,"
也不
"67,89,10,0876,,"
看看这是否适合您的情况。
你可以在没有正则表达式和 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
在 php 中,我需要验证来自 textarea 输入的任意数量的正数 and/or 负数。数字可以是浮点数,用逗号分隔。
有效:
",,,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,,,"
有人可以帮助改进此代码吗?
您可以使用
/^,*(-?\d*\.?\d+)?(?:,+\g<1>)*,*$/
参见regex demo。
详情
^
- 字符串开始,*
- 0+ 逗号(-?\d*\.?\d+)?
- 可选的捕获组 1 匹配一个浮点数(注意:如果你不想像浮点数那样匹配.8
,你可以保留原来的\d+(?:\d+)?
)(?:,+\g<1>)*
- 重复 0 次以上,+
- 1+ 逗号\g<1>
- 捕获组 1 模式(这是一个 subroutine call,等于(?1)
,用于重复第一个捕获组子模式)
,*
- 0+ 逗号$
- 字符串结尾。
我会尝试这样的事情:
$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";
}
}
我更喜欢展开字符串,因为有时正则表达式对于长字符串可能会很棘手。
我将你的正则表达式修改为 ^(-?\d+(\.\d+)?,?)+$
现在它将验证像
这样的字符串"66,78.8,-89.8,0.0,3.14"
但不是
",,,66,,78.8,-89.8,,0.0,,3.14,"
也不
"67,89,10,0876,,"
看看这是否适合您的情况。
你可以在没有正则表达式和 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