我试图了解正则表达式,并且我想防止输入数字(如果长度为8,则以550开头,如果长度为5,则以393开头)。
在这里(https://regex101.com/)进行了尝试,下面显示了正确的表达式
{{1}}
但是我的代码中的掩码在«online»模式下工作,由于某种原因,只允许以550或393开头的数字,其余的输入则被禁止(甚至不能输入10000)。如何重新制作此表达式?
答案 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+)$
说明:
^ # 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+)$
它基本上添加了.*e\+.*
作为选项(搜索e
后跟+
)