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

編集: これは@elclanrsjsfiddleの復帰です

于 2012-10-16T08:50:42.660 に答える
2

私はあなたがこれを探していると思います:

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

編集:

これは少し優れています(@HashemQolamiと@elclanrs?:に触発されて):\d

/^[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

選択した回答は「abc」では機能しないか、場合によっては3つ以上のレベルでは機能しないことに注意してください。

アップデート:

私は少し(非常に基本的な)テストを行いました:

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 に答える
0

@dionyzizに基づいて、この作業に答えます。

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

次の正規表現は、必要なことを実行します。アルファベットの文字列をチェックしてから、ドットで区切られた他の複数のアルファベットの文字列を許可します。

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