0

我有一个匹配价格的正则表达式,其中小数是可选的,就像这样,

/[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

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

4

2 回答 2

1

我会分两步做。首先删除任何没有任何内容的非数字和非点字符。

/[^0-9.]//g

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

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

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

于 2013-09-26T09:10:32.113 回答
0

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

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

需要注意的是,我怀疑您指的是 JavaScript 的 replace 函数,它是 String 对象的成员,而不是 jQuery replaceWith 和 replaceAll 函数,指的是“jQuery 替换函数”。后者是“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>

此处指定的类与文斯的回答中指定的类之间的区别在于我包括过滤前导 0。需要注意的是,在 Vince 的第一个 reg ex 中,可能有一个额外的“/”——但也许它有一个我没有理解的目的。

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

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

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

- 如果有人可以识别出精确的“反向”模式,请随意 - 我在理解如何解释前瞻时遇到了一些麻烦,至少对于某些细微差别。

这依赖于当今 JavaScript 支持的“负前瞻”功能。您可以参考几个 stackoverflow 帖子以获取更多信息(例如,正则表达式和否定整个字符组),并且可以在 Internet 上找到多个讨论“前瞻”和“后瞻”的资源。

我想这个答案相对于已经给出的答案有些多余——我可能已经评论了原始海报的帖子或文斯的答案(而不是写下我的至少部分答案),但我还不能发表评论!

于 2013-09-26T10:26:09.957 回答