1

我需要检查一个字符串是否代表一个有效的命名空间格式。命名空间由用点分隔的 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/

4

5 回答 5

5

编辑:这个应该适用于每种情况:

/^(?:[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

演示:http: //jsfiddle.net/elclanrs/5hnQV/

于 2012-10-16T08:42:48.467 回答
2

我想你正在寻找这个:

/^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*$/i

编辑:

这个稍微好一点(受到@HashemQolami?:\d@elclanrs 的启发):

/^[a-z][a-z\d]*(?:\.[a-z][a-z\d]*)*$/i

这个更短,但做同样的工作:

/^[a-z](?:[a-z\d]*(?:\.[a-z])?)*$/i

这个也是,使用前瞻来测试它不以 a 结尾.

/^(?!.*\.$)(?:[a-z][a-z\d]*\.?)+$/i

请注意,所选答案不适用于“abc”或在某些情况下超过两个级别。

更新:

我做了一个小(非常基本的)测试:

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>");
于 2012-10-16T08:56:28.117 回答
2

试试这个模式:

/^[a-z][a-z0-9]*(?:\.[a-z][a-z0-9]*)*$/i

编辑: 这是@elclanrs jsfiddle的回归

于 2012-10-16T08:50:42.660 回答
0

基于@dionyziz 回答这项工作:

/^[a-z]+(\.[a-z]+)*[^.\s]$/
于 2012-10-16T08:58:09.240 回答
-1

以下正则表达式将满足您的需求。它检查一个字母字符串,然后允许多个其他字母字符串用点分隔。

/^[a-z]+(\.[a-z]+)*$/
于 2012-10-16T08:41:49.730 回答