JavaScript正则校验首尾非点文本失效,regex101测试正常脚本失败
问题原因
- 正则结构逻辑错误:后行否定断言
(?<!\.)放置在结束标识符$之后,该位置不存在任何可匹配内容,直接导致整个正则匹配失败。 - 转义符解析失效:使用
RegExp构造函数传入字符串参数时,反斜杠是字符串本身的转义字符,你写的\.会被解析为普通字符.,正则规则里的转义逻辑直接失效,需要写为\\.才能保留正则层面的转义效果。 - 多余的标志位错误:
- 全局
g标志开启后,test()方法会维护内部的lastIndex指针记录上次匹配位置,多次调用同一正则实例时会出现匹配结果异常,你的场景不需要全局匹配。 - 多行
m标志开启后,^和$会匹配每一行的首尾,不符合你校验整个字符串首尾规则的需求。
- 全局
修复方案
更推荐使用正则字面量写法,无需额外处理转义符,代码更简洁:
var check = "test" var pattern = /^(?!\.)[a-zA-Z0-9._-]+(?<!\.)$/; var validate_check = pattern.test(check);
如果需要使用RegExp构造函数写法,注意转义反斜杠,删除多余标志位:
var check = "test" var pattern = new RegExp('^(?!\\.)[a-zA-Z0-9._-]+(?<!\\.)$','i'); var validate_check = pattern.test(check);
注:
i标志用于忽略大小写,如果你的规则要求区分大小写,可以直接删除该标志。
内容的提问来源于stack exchange,提问作者Firehawk
相关产品推荐
相关产品推荐

