检测正则表达式中的多个句点并终止整个匹配

时间:2017-07-01 01:58:52

标签: regex

我试图用这个来检测正则表达式中的价格:

^\-?[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上搜索但似乎无法找到正确的答案。我该怎么做?

3 个答案:

答案 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)

您可以通过要求只有0或1个句点来限制它:

^[0-9,]+[\.]{0,1}?[0-9,]+$

enter image description here