如何在Javascript正则表达式中检测名称空间字符串?

如何在Javascript正则表达式中检测名称空间字符串?,javascript,Javascript,我需要检查字符串是否表示有效的命名空间格式。名称空间由用点分隔的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(

我需要检查字符串是否表示有效的命名空间格式。名称空间由用点分隔的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
}
无效命名空间:

"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
}
目前我使用这个简单的regexp,但它并没有检查所有无效的名称空间:

"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
}
对于检查字符串是否表示有效名称空间的小而有效的方法,有什么更好的建议吗


这里有一个小JSFIDLE,您可以用来测试这个正则表达式:

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

/^[a-z]+(\.[a-z]+)*$/

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

/^[a-z]+(\.[a-z]+)*$/
编辑:此选项适用于所有情况:

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

编辑:此选项适用于所有情况:

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

尝试以下模式:

/^[a-z][a-z0-9]*(?:\.[a-z][a-z0-9]*)*$/i
编辑: 这是@elclanrs的翻版

尝试以下模式:

/^[a-z][a-z0-9]*(?:\.[a-z][a-z0-9]*)*$/i
编辑:
这是@elclanrs的翻版

我想你在寻找这个:

/^[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
这一个也是,使用lookahead来测试它是否以a结尾:

请注意,所选答案不适用于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>");

我想你正在寻找这个:

/^[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
这一个也是,使用lookahead来测试它是否以a结尾:

请注意,所选答案不适用于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>");

基于@dionyziz回答这项工作:

/^[a-z]+(\.[a-z]+)*[^.\s]$/

基于@dionyziz回答这项工作:

/^[a-z]+(\.[a-z]+)*[^.\s]$/

添加了一个更好的正则表达式,这在大多数情况下都可以使用。请按您的模式检查此字符串:com.company.package.1出现问题了!每个id都以字母字符开头,并以字母数字字符继续,所以为什么此字符串无效?com.company4或c0Mn不确定这是否有效,但我认为这将像添加\d*/^?:[a-z]\d*\.?+[^.\s\d]$/I一样简单。没有尝试过。+1个很好的例子和很好的例子!请你再解释一下正则表达式好吗?添加了一个更好的正则表达式,在大多数情况下都应该这样做。请按您的模式检查此字符串:com.company.package.1有问题!每个id都以字母字符开头,并以字母数字字符继续,所以为什么此字符串无效?com.company4或c0Mn不确定这是否有效,但我认为这将像添加\d*/^?:[a-z]\d*\.?+[^.\s\d]$/I一样简单。没有尝试过。+1个很好的例子和很好的例子!你能解释一下regex吗?几乎和我的一样,但我认为你的更好,因为它不会用?:。我想你应该加上“I”标志。@Pato,你是对的,但我只是想说明模式应该如何,除了标志:D@HashemQolami:在JS中,您可以使用\d而不是0-9,您可以在此处保存一些字节。只是一个提示。XD几乎和我的一样,但我认为你的更好,因为它不会用?:。来捕捉团队。我想你应该加上“I”标志。@Pato,你是对的,但我只是想说明模式应该如何,除了标志:D@HashemQolami:在JS中,您可以使用\d而不是0-9,您可以在此处保存一些字节。只是一个提示。xDThank you@AlexStack,我修复了正则表达式。Thank you@AlexStack,我修复了正则表达式。