【问题标题】:Negating Regular Expression for Price否定价格的正则表达式
【发布时间】:2013-10-01 20:01:12
【问题描述】:

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

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

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

【问题讨论】:

  • 也许我们可以通过否定正则表达式更好地帮助您完成您想要完成的实际任务?并且请提供您正在使用的编程语言。
  • 您期望接受的字符串到底是什么?
  • @justhalf 我更新了问题以便更清楚地了解我想要完成的工作
  • 你怎么能从S$4sd3.24151 . x45 blah blah text blah得到43.24

标签: regex negate


【解决方案1】:

我会分两步完成。首先删除任何非数字和非点字符,什么都没有。

/[^0-9.]//g

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

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

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

【讨论】:

    【解决方案2】:

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

    为了仅根据您提供的示例提出一个解决方案,我将提供一个与 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>
    

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

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

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

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

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

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

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

    【讨论】:

    • 信息量很大,我学到了一些东西。我对正则表达式很陌生,所以我很感激你的 cmets。顺便说一句,我实际上是想让正则表达式匹配零、一位或两位小数。再次感谢!
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2016-03-23
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    相关资源
    最近更新 更多