我需要一个符合以下条件的正则表达式:
a.b.c
a0.b_.c
a.bca._cda.dca-fb
请注意,它可以包含数字,但组之间用点分隔。允许的字符为a-zA-z, -, _, 0-9
规则是它不能以数字开头,也不能以点结束。即正则表达式应该不匹配
0a.b.c
a.b.c.d.
我想出了一个regex,它似乎可以在regex101上运行,但不能在javascript上使用
([a-zA-Z]+.?)((\w+).)*(\w+)
但是在js中似乎不起作用:
var str = "a.b.c"
if (str.match("([a-zA-Z]+.?)((\w+).)*(\w+)")) {
console.log("match");
} else {
console.log("not match");
}
// says not match
答案 0 :(得分:1)
使用正斜杠/
,并在使用JavaScipt时从在线正则表达式测试器中将正则表达式代码粘贴在它们之间。
在这里,我对您的正则表达式模式所做的更改:
^
以匹配输入的开头$
以匹配输入的末尾A-Z
,并添加了i
修饰符,以进行不区分大小写的搜索(这是可选的)。另外,当您使用regex101时,请确保在创建/测试JavaScript正则表达式时选择JavaScript Flavor 。
var pattern = /^([a-z]+.?)((\w+).)*(\w+)$/i;
// list of strings, that should be matched
var shouldMatch = [
'a.b.c',
'a0.b_.c',
'a.bca._cda.dca-fb'
];
// list of strings, that should not be matched
var shouldNotMatch = [
'0a.b.c',
'a.b.c.d.'
];
shouldMatch.forEach(function (string) {
if (string.match(pattern)) {
console.log('matched, as it should: "' + string + '"');
} else {
console.log('should\'ve matched, but it didn\'t: "' + string + '"');
}
});
shouldNotMatch.forEach(function (string) {
if (!string.match(pattern)) {
console.log('didn\'t match, as it should: "' + string + '"');
} else {
console.log('shouldn\'t have matched, but it did: "' + string + '"');
}
});
答案 1 :(得分:0)
如果您使用锚点声明行的开始^
和结束$
,则您的正则表达式将与您的值匹配。
您也可以使用:
这将断言行^
的开始,匹配单词字符\w
(将匹配[a-zA-Z0-9_]
)或字符类中的连字符[\w-]
。
然后重复与字符类(?:\.[\w-]+)*
中的点和允许的字符匹配的模式,直到行$
的结尾
const strings = [
"a.b.c",
"A.b.c",
"a0.b_.c",
"a.bca._cda.dca-fb",
"0a.b.c",
"a.b.c.d."
];
let pattern = /^[a-z][\w-]*(?:\.[\w-]+)*$/i;
strings.forEach((s) => {
console.log(s + " ==> " + pattern.test(s));
});
如果比赛不应该以数字开头但可以以下划线或连字符开头,则可以使用: