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}))?$