我试图用javascript验证文本,但可以找出为什么它不工作。
我一直在使用:https://regex101.com/测试它在哪里工作,但在我的脚本它失败
var check = "test"
var pattern = new RegExp('^(?!.)[a-zA-Z0-9._-]+$(?<!.)','gmi');
if (!pattern.test(check)) validate_check = false;else validate_check = true;
我要找的是第一个和最后一个字符不是点,字符串可能包含[a- za - z0 -9._-]
但是上面的检查总是失败,即使在:test
这个词上+$(?<!.)
在您的RegEx中无效
$
将匹配文本或行尾(带有m
标志)- 负向后看→
(?<!Y)X
将匹配X
,但仅当Y
是而不是时在
更简单的正则表达式呢?
var checks = ["test", "1-t.e_s.t0", ".test", "test.", ".test."];
checks.forEach(check => {
var pattern = new RegExp('^[^.][a-zA-Z0-9._-]+[^.]$','gmi');
console.log(check, pattern.test(check))
});
你的代码应该是这样的:
var check = "test";
var pattern = new RegExp('^[^.][a-zA-Z0-9._-]+[^.]$','gmi');
var validate_check = pattern.test(check);
console.log(validate_check);
关于模式的几点注意事项:
- 您正在使用RegExp构造函数,您必须对反斜杠进行双转义。在这种情况下,只有一个反斜杠,模式是
^(?!.)[a-zA-Z0-9._-]+$(?<!.)
,如果右边有一个换行符以外的字符,第一个负向前看将使模式失败,这就是为什么它不匹配test
- 如果您使用
/i
标志来进行不区分大小写的匹配,您可以将[A-Za-z]
缩短为[a-z]
的范围之一,或者使用w
来匹配单词字符,如字符类 - 这部分
(?<!.)
使用负向后看在您的模式中不是无效的,但并不总是支持
对于您的需求,您不必使用查找。如果您还希望允许使用单个字符,则可以使用:
^[w-]+(?:[w.-]*[w-])?$
^
起始字符串[w-]+
匹配1+个单词字符或-
(?:
非捕获组[w.-]*[w-]
匹配可选的字字符,点或连字符
)?
关闭非捕获组并使其为可选$
字符串结束
Regex演示
const regex = /^[w-]+(?:[w.-]*[w-])?$/;
["test", "abc....abc", "a", ".test", "test."]
.forEach((s) =>
console.log(`${s} --> ${regex.test(s)}`)
);