2013-09-26 39 views
0

我有对价正则表达式,其中小数是可选的,像这样,否定正则表达式价格

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

现在我想要做的是得到表达的倒数,但有无法做到的。我想出了一些简单的东西,

/[^0-9.]/g 

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

“S $ 4sd3.24151。X45等等等等等等的文字” 或 “!#%!$ 43.24.234asdf等等等等等等文本”

它将返回

43.24

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

+0

也许我们可以通过否定正则表达式来帮助您更好地完成您想要完成的实际任务?还请提供您正在使用的编程语言。 – justhalf

+0

你预期接受的字符串是什么? – justhalf

+0

@justhalf我更新了这个问题,以便更清楚地了解我想要完成什么 – LJS

回答

1

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

/[^0-9.]//g 

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

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

这样做会给你43.24这两个例子。

+0

这适用于我,谢谢! – LJS

0

我想在编程时,并不总是清楚“反”意味着什么。

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

请注意,我怀疑你指的是JavaScript的替换函数,它是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> 

这里指定的类之间以及文斯的回答是,我包括滤波前导零的区别。 需要注意的是,在Vince的第一个注册前,可能会有一个额外的'/' - 但也许它有一个目的,我没有抓住。

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

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

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

- 如果有人能够识别一个正好'反向'的模式,请放心 - 我在理解如何解释至少一些细微差别的方面有些困难。

这依赖于JavaScript这些日子支持的“负面预测”功能。您可以参考多个计算器发布以了解更多信息(例如,Regular Expressions and negating a whole character group),并且可以在Internet上找到讨论“向前看”和“向后看”的多种资源。

我想这个答案有一些已经给予的冗余 - 我可能已经评论过原始海报的帖子或Vince的答案(而不是至少写出我的答案部分),但我还没有能够发表评论!

+0

非常丰富,我学到了一些东西。我对正则表达式很陌生,所以我赞赏你的意见。顺便说一句,我其实意味着正则表达式匹配零个,一个或两个小数。再次感谢! – LJS