否定正则表达式的价格

时间:2013-09-26 02:21:25

标签: regex negate

我有一个匹配价格的正则表达式,其中小数是可选的,如此,

/[0-9]+(\.[0-9]{1,2})?/

现在我想做的是获得表达式的反转,但是却无法做到这一点。我想出了一些简单的东西,

/[^0-9.]/g

但这允许多个'。'小数点后的字符和2个以上的数字。我在模糊上使用jQuery替换功能来纠正输入价格字段。因此,如果用户输入类似的内容,

“S $ 4sd3.24151.x45 blah blah text blah”或“!#%!$ 43.24.234asdf blah blah text blah”

它会返回

43.24

有人可以提供任何建议吗?

2 个答案:

答案 0 :(得分:1)

我会分两步完成。首先删除任何非数字和非点字符。

/[^0-9.]//g

这将分别为第一个和第二个示例生成43.24151.4543.24.234。 然后,您可以使用您的第一个正则表达式来匹配有效价格的第一次出现。

/\d(\.\d{1,2})?/

这样做会为您提供43.24两个示例。

答案 1 :(得分:0)

我认为在编程中,并不总是清楚“逆”是什么意思。

要根据您提供的示例专门提出解决方案,我将提供一个与Vince提供的非常相似的解决方案。我很难编写一个正则表达式,它既匹配您需要的模式,又通过重复捕获组捕获可能任意数量的数字。而且我不确定这是否可以以某种合理的方式行事(也许是别人做的)。但是两步法应该是直截了当的。

要注意,我怀疑你指的是JavaScript的replace函数,它是String Object的成员,而不是jQuery replaceWith和replaceAll函数,在引用'jQuery replace function'时。后者是'Dom操纵'功能。但是,如果我误解了,请纠正我。

例如,根据某些假设输入,您可以使用

<b>var numeric_raw = jQuery('input.textbox').attr ('value').replace (/[^0-9.]/g, "")</b>

从文本字段中输入的值中删除非数字或句点的所有字符; 然后你可以使用

<b>var numeric_str = numeric_raw.replace (/^[0]*(\d+\.\d{1,2}).*$/, "$1")</b>

这里指定的类与Vince的答案之间的区别在于我包括对前导0进行过滤。 要注意的是,在Vince的第一个注册表中,可能会有一个额外的'/' - 但也许它有一个我没有抓住的目的。

关于“逆”,理解你的初步调查的一种方法是你正在寻找一个与你提供的表达式相反的表达式。 要注意,虽然您提供的表达式(/[0-9]+(.[0-9] {1,200)?/)确实匹配整数和最多两位小数的十进制数,但它也是匹配任何单个数字 - 因此,对于给定的输入字符串,它可以标识可能未设想的匹配。表达式没有锚点('^','$'),因此可能允许多个可能的匹配。例如,在字符串“1.111”中,“1.11”和“1”都匹配您提供的模式。

在我看来,匹配任何与您的模式不匹配的字符串的模式如下,或者至少在大多数情况下是这样的:

/^(?:(?!.*[0-9]+(\.[0-9]{1,2})?).*)*$/

- 如果某人能够确定一个正确的“反向”模式,请随意 - 我很难理解前瞻是如何被解释的至少是一些细微差别。

这依赖于“负向前瞻”功能,这些日子支持JavaScript。您可以参考几个stackoverflow发布以获取更多信息(例如 Regular Expressions and negating a whole character group ),并且可以在Internet上找到多个讨论“lookahead”和“lookbehind”的资源。 / p>

我认为这个答案对于已经给出的答案有一些冗余 - 我可能已经对原始海报的帖子或Vince的答案进行了评论(而不是至少写下我的部分答案),但我还不能发表评论!