1

次の条件でユーザー名の正規表現を実装したい:

  1. ユーザー名は、az、AZ、0-9、および - (ハイフン) のみで構成されます。

  2. ユーザー名は、数字のみまたはハイフンのみで構成されるものではありませんが、文字のみを使用できます。

  3. 最初と最後の文字はハイフンにしないでください (数字にすることはできますが、完全に数字にすることはできません)。

  4. また、連続した 2 つのハイフンがあってはなりません。

  5. 文字の最小数は 5 で、最大は 25 です。

これまでのところ、この正規表現を試しました:

var filter = /(?=[a-zA-Z0-9-]{5,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$/;

条件 1、3、4、および 5 を正しく達成します。しかし、条件 2 を完全には満たしていません。私の正規表現では、完全にハイフンで構成されていないことを確認します。ただし、許可されるべきではない数字のみが許可されます。

どこが間違っているのか、何をする必要があるのか​​ 誰にでも教えてもらえますか。正規表現の説明をいただければ幸いです。

4

3 に答える 3

5

保守性のために、このようなことは通常、1 つの大きなテストではなく、一連のテストとして作成する方が適切です。

var filter = function (username) {
    var allDigits = /^[0-9]+$/g,
        allHyphens = /^[-]+$/g, //doesn't need a character class, but I find it's more readable
        multiHyphens = /[-]+/g,
        startsWith = /^[A-Za-z0-9]{1}/,
        endsWith = /[A-Za-z0-9]{1}$/
        hasInvalidChars = /[^A-Za-z0-9-]/,
        meetsReqs = false;
    if (username.length >= 5 || username.length <= 25) { //ensure correct length
        meetsReqs = !allDigits.test(username);
        meetsReqs = meetsReqs && !allHyphens.test(username);
        meetsReqs = meetsReqs && !multiHyphens.test(username);
        meetsReqs = meetsReqs && !hasInvalidChars.test(username);
        meetsReqs = meetsReqs && startsWith.test(username);
        meetsReqs = meetsReqs && endsWith.test(username);
    }
    return meetsReqs;
};
于 2013-07-04T16:43:15.803 に答える
0

これは、私のコンピューターでの簡単なテストで機能するようです。

^(?![^-]*--+)(?![0-9]+$)[a-zA-Z0-9][-a-zA-Z0-9]{3,23}[a-zA-Z0-9]$

説明

^(?![^-]*--+)  No double (or more) hyphens
(?![0-9]+$)    Digits only forbidden
[a-zA-Z0-9]    Starts with a-z A-Z or 0-9
[-a-zA-Z0-9]{3,23}  Three to 23 more characters, including hyphens
[a-zA-Z0-9]$    Ends with a-z A-Z or 0-9

つまり、1 + (3 から 23) + 1 文字、つまり 5 から 25 です。

于 2013-07-04T17:04:21.927 に答える