如何在Javascript正则表达式中检测名称空间字符串?
我需要检查字符串是否表示有效的命名空间格式。名称空间由用点分隔的ID组成。每个id以字母字符开头,以字母数字字符继续 有效名称空间:如何在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(
"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,我修复了正则表达式。