【问题标题】:Floating number regex between 0 and 1介于 0 和 1 之间的浮点数正则表达式
【发布时间】:2013-01-22 15:21:53
【问题描述】:

我正在尝试验证浮点数的输入,最大值为1.0,最小值为0

Min : 0
Max : 1

可能的值;

0.1
0.99
0.365

我怎样才能用正则表达式成功?

【问题讨论】:

  • 您为什么要使用正则表达式?即便如此,你尝试过什么?
  • 科学记数法是否可接受 (1.2e-1)?是否需要前导零(例如,0.123 可以吗)?标志可以吗 (+0.5)?
  • 努力学习正则表达式@Rohit
  • 这是验证(字符串仅包含您要检查的数字)还是匹配(查找与正则表达式匹配的子字符串)?解决方案会略有不同。
  • @tylerdurden 如果您正在尝试学习正则表达式(或其他任何东西),那么提出实际上只有具体的最终答案的问题不会有太大帮助。我认为 read, try, fail, repeat until success 方法在这里更合适;可能会跟进一个问题“我让 X 工作了,但是为什么尝试了 Y 却没有,为什么?

标签: regex


【解决方案1】:

作为 javascript 正则表达式文字:

 /^(0(\.\d+)?|1(\.0+)?)$/

【讨论】:

    【解决方案2】:
    0(\.\d+)?|1\.0
    

    解释:

    0            # a zero
    (\.\d+)?     # a dot and min 1 numeric digit - this is made optional by ?
    |            # or
    1\.0         # one, a dot and a zero
    

    如果您需要它来匹配整个 sring,那么您将需要分别代表字符串开头和结尾的插入符号和美元符号,例如 ^(0(\.\d+)?|1\.0)$

    此外,如果您想查找可能的负数,您需要在前面添加一个可选的减号,例如 ^-?(0(\.\d+)?|1\.0)$。当然,对于指数,模式需要改变。

    【讨论】:

    • 我还为1 设置了.0 可选。除此之外,很好的解决方案。
    • 也匹配负值
    【解决方案3】:

    就是这样:

    /^(0+\.?|0*\.\d+|0*1(\.0*)?)$/
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • @NathanOliver,我的目标是那些难以形成表达但自己可以阅读和理解的人。
    • @NathanOliver,顺便说一句,接受的答案也没有任何解释。
    • 您的答案出现在审核队列中。它看起来不错,所以我只是评论说如果有解释会更好。我不是把你挑出来,只是添加一些建设性的批评。如果您不想添加任何内容,则无需添加任何内容。
    • 这部分 0*1\.?0* 的正则表达式匹配 10000
    【解决方案4】:

    这对我有用:

    0+([.][0-9]+)?|1([.]0)?
    

    还是我错过了什么? :)

    【讨论】:

      【解决方案5】:

      这个 RegEx 应该没问题:

      /((0(\.[0-9]*)?)|(1(\.0)?))/
      

      除非您打算匹配指数形式的浮点数。

      【讨论】:

      • 这也将匹配1.9
      • 与边界不匹配?
      • 不必要的东西太多,缺少重要的锚:^(0\.\d*|1\.0)$你也忘了01
      • 我不是来这里学习的,tylerdurden 是。如果他想了解这是如何工作的,他可以想出额外的步骤。
      • @MihaiStancu:希望他测试了代码。实际上有很多方法可以指定从 0 到 1 的数字,即使没有 exp。形式。正则表达式中的微小变化可以允许或禁止一些。
      【解决方案6】:

      这将匹配 [0,1] 中带有可选符号的浮点数,但如果使用科学计数法或数字以小数点开头,则不匹配。

      \+?(0(\.[0-9]+)?|1(\.0+)?)
      

      【讨论】:

      • 匹配大于1的数
      • 不应该,但我错过了包含第一个反斜杠,因此表达式根本不匹配。但是,它将匹配 111 的三倍 1,除非您附加诸如 $\s[^0-9] 之类的东西或类似的东西来强制在多个数字之间进行某种分隔。
      • 它不匹配1.1,但它分别匹配第一个和第二个1。与 2.0 类似 - 它匹配 0
      【解决方案7】:

      一个通用的解决方案:

      ^0*(?:(?:0(?:\.\d*)?|\.\d+)|1(?:\.0*)?)$

      格式化:

       ^     
       0* 
       (?:
            (?:
                 0 
                 (?: \. \d* )?
              |  \. \d+ 
            )
         |  
            1 
            (?: \. 0* )?
       )
       $
      

      【讨论】:

        【解决方案8】:

        ^(?:(?<!\d*[1-9]\.?0*)(?:(?:0+(?:\.\d+)?)|(?:\.\d+)|(?:1(?!\.0*[1-9]+)(?:\.0+)?)))$

        这将接受以下格式的数字 [0,1]

        0 0.5 .5 1 1.0 1.000

        【讨论】:

          【解决方案9】:

          只需阅读有关正则表达式的简介。 希望这行得通!

          ^(0.0*[1-9](\d+)?)$
          

          如果我遗漏了什么,请告诉我。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-27
            • 1970-01-01
            • 1970-01-01
            • 2012-04-10
            • 1970-01-01
            • 2015-02-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多