我试图用这个来检测正则表达式中的价格:
^\-?[0-9]+(,[0-9]+)?(\.[0-9]+)?
这包括:
12
12.5
12.50
12500
12,500.00
但如果我通过它
12..50或12.5.0或12.0。
它仍会在12上返回一个匹配。如果整个字符串中有多个句点,我希望它否定整个字符串并且根本不返回匹配项。
我一直试图让我的头围绕负面的前瞻一小时,并在Stack Overflow上搜索但似乎无法找到正确的答案。我该怎么做?
答案 0 :(得分:2)
你的正则表达式:
^\-?[0-9]+(,[0-9]+)?(\.[0-9]+)?
注意:您提供的正则表达式似乎不适用于12
(没有“.
”)。由于您未在\.
之后添加量词,因此它会尝试按字面匹配该模式(.
)。
虽然有多种方法可以解决这个问题,但最“正确”的答案取决于您的具体要求,这里的正则表达式不匹配12..1
,但会匹配{{ 1}}:
12.1
我包围了您在捕获组(^\-?[0-9]+(?:,[0-9]+)?(?:\.[0-9]+))+
中提供的整个正则表达式,并在最后添加了一个一个或多个量词(...)
,这样整个正则表达式都会失败如果它不满足那种模式。
此外(这可能是你想要的也可能不是),我将内部组修改为非捕获组+
,这样它就不会返回不必要的组。
该网站提供对正则表达式的解构并解释它们:
对于提供的正则表达式:https://regex101.com/r/EDimzu/2
单元测试:https://regex101.com/r/EDimzu/2/tests(注意(?: ... )
多种语言的失败。)
答案 1 :(得分:2)
您在寻找什么,是这样的:
^\d+(,\d{3})*(\.\d{1,2})?$
它的作用:
^ Start of Line
\d+ one or more Digits followed by
(,\d{3})* zero, one or more times a , followed by three Digits followed by
(\.\d{1,2})? one or zero . followed by one or two Digits followed by
$ End of Line
这只会匹配有效价格。逗号(,)在此正则表达式中不是强制性的,但它将匹配。
请看这里:http://www.regextester.com/?fam=98001
如果您使用价格并希望将它们存储在数据库中,我建议将它们保存为INT。因此1,234,56变为123456或1,234变为123400.在匹配有效价格之后,您所要做的就是删除,s,按点拆分值,并用str_pad()填充[1]的值(带零的STR_PAD_RIGHT)。当您使用Javascript或其他不同的语言时,这会使计算变得更加简单。
答案 2 :(得分:0)