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

正则表达式

  •  -3
  • Ican  · 技术社区  · 8 年前

    我试图理解正则表达式,我想防止输入以550开头的数字,如果长度为8,或者以393开头的数字,如果长度为5。

    在这里试过( https://regex101.com/ )正确的表达式如下所示

    ^((?!550)\d{8}|(?!393)\d{5})$
    

    但我的代码中的掩码在在线模式下工作,出于某种原因,只允许以550或393开头的数字,其余的输入是禁止的(甚至不能输入10000)。如何重新制作这个表达式?

    2 回复  |  直到 7 年前
        1
  •  0
  •   meisterluk Michael Borgwardt    8 年前

    我建议不要用正则表达式来解决这个问题。没有简单的方式来表达“除了这个特殊的字符串以外的任何字符串”。

    我的实施:

    let accept = function (v) {
      v = v.toString();
      if (v.substr(0, 3) === '550')
        return v.length !== 8;
      else if (v.substr(0, 3) === '393')
        return v.length !== 5;
      return true;
    }
    

    测试用例:

    >> accept(12)
    true
    >> accept(12345678)
    true
    >> accept(55045678)
    false
    >> accept(55145678)
    true
    >> accept(39345)
    false
    >> accept(39445)
    true
    >> # special case
    >> accept(550 * 10e155)
    true
    >> (550 * 10e155).toString()  # reason
    "5.5e+158"
    

    这种实现也适用于非常大的数字,因为非常大的整数是用指数表示的。

    如果仍然确定要使用正则表达式,请执行以下操作:

    let accept = (v) => ((/^((?!550)\d{8}|(?!393)\d{5}|\d{0,4}|\d{6,7}|\d{9,})$/).exec(v) !== null)
    

    您需要为正则表达式定义交替路径,如果其长度不等于5和8,则正则表达式将接受字符串。

    >> accept(12)
    true
    >> accept(12345678)
    true
    >> accept(55045678)
    false
    >> accept(55145678)
    true
    >> accept(39345)
    false
    >> accept(39445)
    true
    >> accept(550 * 10e155)
    false
    

    这个实现失败了,因为需要在Javascript中正确实现数字的浮点表示,才能接受大数字。这太乏味了。我不推荐这种方法。

        2
  •  0
  •   Julio    8 年前

    我觉得你的正则表达式错了。它甚至不允许匹配长度不同于5或8的数字。

    你可能想试试这个: ^(?:(?!550)\d{8}|(?!393)\d{5}|(?!\d{5}$|\d{8}$)\d+)$

    Demo

    解释:

    ^                              # begin of line/string
      (?:                          # group of options (separated by '|'
           (?!550)\d{8}            # 8 digits not starting by 550
         | (?!393)\d{5}            # 5 digits not starting by 393
         | (?!\d{5}$|\d{8}$) \d+   # some digits that must not be 5 and 8 and then end of line (5 and 8 should be treated above)
      )
    $                              # end of line/string
    

    如果您还希望允许使用科学记数法中的大数字,请使用以下方法: ^(?:.*e\+.*|(?!550)\d{8}|(?!393)\d{5}|(?!\d{5}$|\d{8}$)\d+)$

    Demo

    它基本上增加了 .*e\+.* 作为选项(搜索 e 然后 + )