0

パスワードをテストしようとしています。文字列のテストを行う必要があります。toUpperCase()でテストすると、特殊文字がtrueと評価されることがわかりました。私は彼らが偽と評価するだろうと思うでしょう。

特殊文字をどのようにテストする必要がありますか?

// CREATE ARRAY OF CHARACTERS
CharacterArray = ["1","2","3","a","b","c","D","E","F","/","+",")"];

// TEST CHARACTERS 
function testCharacters() {
    // GET ARRAY LEN
    var CharacterArrayLen = CharacterArray.length;
    // LOOP THROUGH ARRAY
    for (i = 0; i < CharacterArrayLen; i++) {
        // PARSE SINGLE CHARACTER
        var ThisChar = CharacterArray[i];

        if (!isNaN(ThisChar)) {
            alert(ThisChar + ' is numeric!');
        } else {
            if (ThisChar === ThisChar.toUpperCase()) {
                alert(ThisChar + ' is upper case');
            } else if (ThisChar === ThisChar.toLowerCase()) {
                alert(ThisChar + " is lower case");
            }
        }   
    }
}
testCharacters();
4

4 に答える 4

2

大文字でも小文字でもありません。両方とも、それらの文字に対して同じものを返しますtoUpperCasetoLowerCase最初に小文字をテストした場合、それらはすべて小文字であることがわかります。

正規表現を使用して、文字がアルファベットに含まれているかどうかを確認できます。

ThisChar.match(/^[a-zA-Z]$/)

nullアルファベット以外の文字で返されます。

これらの各文字が配列に含まれているかどうかを確認するだけの場合は、次を使用できます。indexOf

CharacterArray.indexOf('a')
> 3
CharacterArray.indexOf('A')
> -1

が配列にない-1ため、2番目のものが返されます。A

これが正規表現を使用したデモです。

于 2012-06-20T20:42:37.933 に答える
2

特殊文字は、直感的にもUni​​code標準によっても、大文字と小文字を区別しません(小文字でも大文字でもありません)。toUpperCase()ただし、JavaScriptは、大文字と小文字を区別しない文字の場合、およびtoLowerCase()メソッドが文字自体を返すように定義されています。

編集された質問からも、正確に何をテストしたいかは明らかではありません。ただし、文字が大文字または小文字であるかどうかをテストする必要がある場合、JavaScriptの適切な基本ロジックは次のとおりです。if ThisChar !== ThisChar.toUpperCase()、thenThisCharは小文字です。If ThisChar!== ThisChar.LowerCase(), thenThisChar`は大文字です。それ以外の場合は、大文字と小文字を区別しない特殊文字または書記体系の文字のいずれかです。

この基本的なロジックは、Unicodeで大文字のマッピングがないシャープなs「ß」などの一部の文字では失敗します(大文字の同等物は2文字の「SS」であり、これは個別に処理する必要があるため)。したがって、関連性がある場合は、それらを特殊なケースとして処理する必要があります。

他のプログラミング言語では、文字のGeneral Categoryプロパティを使用するだけで済みますが、JavaScriptは現在そのプロパティにアクセスできません。Unicode文字データベースから関連ファイルをダウンロードし、前処理して不要な情報を削除し、プログラムにGeneral Categoryプロパティをチェックさせることもできますが、これはやや厄介で、Unicode標準が変更されるたびに更新する必要があります。

于 2012-06-21T05:13:39.520 に答える
1

これは予想される動作です。'else'を削除すると、

if (ThisChar === ThisChar.toUpperCase()) {
    alert(ThisChar + ' is upper case');
} else if (ThisChar === ThisChar.toLowerCase()) {
    alert(ThisChar + " is lower case");
}

になります

if (ThisChar === ThisChar.toUpperCase()) {
    alert(ThisChar + ' is upper case');
} if (ThisChar === ThisChar.toLowerCase()) {
    alert(ThisChar + " is lower case");
}

'/'、'+'、および'('は大文字と小文字の両方と見なされることがわかります。

これは、文字列がすべて特定の場合であるかどうかを判断する関数を検討するときに意味があります。「abcde%」がすべて小文字ではない、または「ABCDE%」がすべて大文字ではない、と言うのは本当に意味がありますか?これらの両方の状況が機能するために、文字以外の文字は大文字と小文字の両方として定義されます。

于 2012-06-20T20:43:11.117 に答える
1

正規表現を使用してみませんか?

function testCharacters(string) {
    var exp = /^[a-z]+$/ig;
    return exp.test(string);
}

正規表現を使用すると、各文字を繰り返す必要がなく、文字列全体を一度にテストできることに注意してください。

于 2012-06-20T20:43:41.897 に答える