正则表达式

时间:2018-08-20 11:11:37

标签: javascript regex

我试图了解正则表达式,并且我想防止输入数字(如果长度为8,则以550开头,如果长度为5,则以393开头)。

在这里(https://regex101.com/)进行了尝试,下面显示了正确的表达式

{{1}}

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

2 个答案:

答案 0 :(得分:0)

我建议不要使用正则表达式解决此问题。没有简单的方法来表达“除此特定字符串外的任何字符串”。

我的实现:

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中正确实现数字的浮点表示形式才能接受大数字。这很乏味。我不推荐这种方法。

答案 1 :(得分:0)

我认为您的正则表达式有误。它甚至不允许匹配长度不同于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后跟+