Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式不太正常_Php_Regex_Price - Fatal编程技术网

PHP正则表达式不太正常

PHP正则表达式不太正常,php,regex,price,Php,Regex,Price,我正在使用以下正则表达式: ^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$ 我使用这个正则表达式检查有效的价格——因此它捕获/拒绝诸如xxx、或llddd或34.23dsd 并允许像100或120.00 它的问题似乎是,如果它是空白(空的),那么它将被视为有效的,而它不应该是有效的——有什么想法可以改变这个吗 感谢您接受yoiur regex并解决了“不匹配空格”的问题: *允许0或更多,而+允许1或更多,因此*允许空白,但+将不允许空白,而是必须至少有一个数字

我正在使用以下正则表达式:

^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$
我使用这个正则表达式检查有效的价格——因此它捕获/拒绝诸如
xxx
、或
llddd
34.23dsd
并允许像
100
120.00
它的问题似乎是,如果它是空白(空的),那么它将被视为有效的,而它不应该是有效的——有什么想法可以改变这个吗


感谢您接受yoiur regex并解决了“不匹配空格”的问题:

*
允许0或更多,而
+
允许1或更多,因此
*
允许空白,但
+
将不允许空白,而是必须至少有一个数字

编辑:

你应该把这个正则表达式清理一下,以便

^[0-9]+(?:[,-])(?:[0-9]{2})?$

这解决了“,,”的匹配问题

编辑2:指出这与我们假设您希望匹配的案例“50,-”不匹配,删除捕获组是假定的。下面是我建议的正则表达式的最新迭代:

^[0-9]+([.,-](-|([0-9]{2}))?)?$

你的问题之一是你在正则表达式中使用了点,它代表“任何字符”。如果你指的是一个点,你需要像这样逃逸它。

此外,您应该至少有一个数字,以便将星号
*
+
替换为“一个或多个”

然后,如果不删除第一部分中的逗号和点,则可以使用.,,,,-:

^[0-9]+(([\.,][-])|([\.,][0-9]{2}))?$

与120.00-@splash58不匹配您正在从复制粘贴代码中转义终止$,这(我猜)是一个人工制品。这将匹配
,.98
这并不意味着你应该研究一种内置的分析货币的方法,这种方法考虑了语言环境。现在它匹配了一个或多个不带数字的逗号-这是OP的原始正则表达式的一部分,我的第二个正则表达式消除了它。公平地说,“减号”显然是用来表示50,-但是你清理过的正则表达式将不再匹配。而且,因为我感兴趣,为什么正则表达式需要“非捕获组”
?:
?哦,我从来没有遇到过“50-”,所以这对我来说并不明显。我使用非捕获组是因为这些组为什么是捕获组?好吧,你是对的,允许使用wills版本,这是错误的——你的组在PCRE a
内部
[]
中似乎工作得更好。实际上,这不是一个特殊的字符和匹配项。“这一个工作得更好且不匹配的原因”这是因为原始正则表达式以
[0-9,.]
开头,我们在回答中都对其进行了修改,以获得提示。我不知道在
[]
中,
是字面意思。不过还是有道理的。再次学到的东西:-)
^[0-9]+(([\.,][-])|([\.,][0-9]{2}))?$