我需要检查字符串是否表示有效的命名空间格式。命名空间由用点分隔的ID组成。每个id都以字母字符开头,并以字母数字字符继续。
有效命名空间:
"com.company.package"
"com.company"
"com"
无效的命名空间:
"1com.company.package"
"com.1company"
"com.com%any"
".com.company"
"com.company."
"com "
" com"
""
"."
"com..company"
目前我使用这个简单的正则表达式,但它确实没有检查所有这些无效的名称空间:
if( /^[\w\.]$/.test( namespaceStr ) ) {
//valid namespace
} else {
//invalid namespace
}
有什么更好的建议,可以通过一种小而有效的方法来检查字符串是否代表有效的命名空间?
这是一个可用于测试此正则表达式的小jsfiddle:http://jsfiddle.net/bA85y/
答案 0 :(得分:4)
编辑:这个适用于每个案例:
/^(?:[a-z]\d*(?:\.[a-z])?)+$/i
如果你不关心捕捉群体更短:
/^([a-z]\d*(\.[a-z])?)+$/i
一点解释:
^ // Start
( // Open group
[a-z]\d* // Must start by letter and may be followed by a number (greedy)
(\.[a-z])? // It may be followed by a dot only if it's followed by a letter (non-greedy)
)+ // Close group and match at least once so we get rid of empty values
$ // Ends, not allow any other characters
答案 1 :(得分:2)
答案 2 :(得分:2)
我认为你正在寻找这个:
/^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*$/i
修改强>
这个更好一点(?:
和\d
受到@HashemQolami和@elclanrs的启发:
/^[a-z][a-z\d]*(?:\.[a-z][a-z\d]*)*$/i
这个更短但做同样的工作:
/^[a-z](?:[a-z\d]*(?:\.[a-z])?)*$/i
也是这个,使用先行来测试它不会以.
结尾:
/^(?!.*\.$)(?:[a-z][a-z\d]*\.?)+$/i
请注意,所选答案不适用于“a.b.c”或在某些情况下具有两个以上级别。
<强>更新强>
我做了一点(非常基本的)测试:
var valid = [
"com.company.package",
"com.company",
"com.company1",
"com1.company1",
"a.b.c",
"a1.b.c3.d",
"a1.b2.c3.d4"];
var invalid = [
"1com.company.package",
"com.1company",
"com.com%any",
".com.company",
"com.company.",
"com ",
" com",
"",
".",
"com..company"];
function testRegex(regex, list)
{
var res=[];
for(var i=0; i<list.length; i++)
{
if(regex.test(list[i]))
res.push(list[i] + " ==> matched");
else
res.push(list[i] + " ==> NOT matched");
}
return res.join('<br>');
}
var regex = /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*$/i;
var html = "<p>VALID</p>";
html += testRegex(regex, valid);
html += "<p>INVALID</p>";
html += testRegex(regex, invalid);
document.write("<div>" + html + "</div>");
答案 3 :(得分:0)
基于@dionyziz回答这项工作:
/^[a-z]+(\.[a-z]+)*[^.\s]$/
答案 4 :(得分:-1)
以下正则表达式将满足您的需求。它检查字母字符串,然后允许用点分隔的多个其他字母字符串。
/^[a-z]+(\.[a-z]+)*$/