代码之家  ›  专栏  ›  技术社区  ›  LJS

否定价格的正则表达式

  •  0
  • LJS  · 技术社区  · 12 年前

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

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

    现在我想做的是得到这个表达式的倒数,但做起来有困难。我想出了一些简单的方法,比如,

    /[^0-9.]/g
    

    但这允许多个“。”字符和小数后2个以上的数字。我在blur上使用jQuery替换函数来更正输入的价格字段。因此,如果用户键入类似的内容,

    “S$4sd3.24151.x45等等,等等,等等”或“!#%!$43.242434sdf等等,等等。”

    它会回来的

    43.24

    有人能为这样做提出建议吗?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Vince    12 年前

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

    /[^0-9.]//g
    

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

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

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

        2
  •  0
  •   Community Mohan Dere    9 年前

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

    为了提出一个完全基于你提出的例子的解决方案,我将提出一个与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的第一个reg ex中,可能会有一个额外的“/”——但也许它有一个我没有意识到的目的。

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

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

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

    --如果有人能识别出一个精确的“反向”模式,请放心——我很难理解lookahead是如何被解释的,至少在一些细微差别上是这样。

    这依赖于“负面展望”功能,而JavaScript目前支持这种功能。你可以参考一些stackerflow的帖子来了解更多信息(例如。 Regular Expressions and negating a whole character group ),在互联网上可以找到多种讨论“前瞻”和“前瞻”的资源

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

    推荐文章