[javascript] 대소 문자를 구분하지 않는 문자열 비교를 수행하는 방법은 무엇입니까?

JavaScript에서 대소 문자를 구분하지 않는 문자열 비교는 어떻게 수행합니까?



답변

특별한 유니 코드 문자에 대해 걱정하지 않는 경우 가장 간단한 방법은 다음을 호출하는 것입니다 toUpperCase.

var areEqual = string1.toUpperCase() === string2.toUpperCase();


답변

편집 :이 답변은 원래 9 년 전에 추가되었습니다. 오늘 당신은 옵션 localeCompare과 함께 사용해야합니다 sensitivity: 'accent':

function ciEquals(a, b) {
    return typeof a === 'string' && typeof b === 'string'
        ? a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0
        : a === b;
}

console.log("'a' = 'a'?", ciEquals('a', 'a'));
console.log("'AaA' = 'aAa'?", ciEquals('AaA', 'aAa'));
console.log("'a' = 'á'?", ciEquals('a', 'á'));
console.log("'a' = 'b'?", ciEquals('a', 'b'));

{ sensitivity: 'accent' }이야기 localeCompare()같은과 같은 기본 문자의 두 가지 변종을 치료 하지 않는 한 그들은 (세 번째 예에서와 같이) 다른 악센트를 위.

또는 { sensitivity: 'base' }기본 문자가 동일한 한 두 문자를 동등하게 취급하는을 사용할 수 있습니다 (따라서 동등 문자로 A처리 á).

참고 그 세 번째 매개 변수 localeCompareIE10에서 지원 또는 낮추거나 당신이 그 브라우저를 지원해야하는 경우, 당신은 대체 어떤 종류의가 필요합니다 그래서 특정 모바일 브라우저 (위에 링크 된 페이지의 호환성 차트를 참조)되지 않습니다

function ciEqualsInner(a, b) {
    return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}

function ciEquals(a, b) {
    if (typeof a !== 'string' || typeof b !== 'string') {
        return a === b;
    }

    //      v--- feature detection
    return ciEqualsInner('A', 'a')
        ? ciEqualsInner(a, b)
        : /*  fallback approach here  */;
}

원래 답변

JavaScript에서 대소 문자를 구분하지 않는 비교를 수행하는 가장 좋은 방법 match()i플래그 와 함께 RegExp 메소드 를 사용 하는 것 입니다.

대소 문자를 구분하지 않는 검색

비교되는 두 문자열이 모두 상수가 아닌 변수 인 경우 문자열에서 RegExp를 생성해야하지만 RegExp 생성자에 문자열을 전달하면 문자열에 특수 정규 표현식이있는 경우 일치하지 않거나 일치하지 않을 수 있으므로 조금 더 복잡합니다. 그 안에 문자.

당신이 국제화에 대해 관심이있는 경우 사용하지 않습니다 toLowerCase()또는 toUpperCase()이 모든 언어의 정확한 대소 문자를 구분 비교를 제공하지 않는 한.

http://www.i18nguy.com/unicode/turkish-i18n.html


답변

최근 의견에서 언급했듯이 string::localeCompare대소 문자를 구분하지 않는 비교를 지원합니다 (다른 강력한 것들 중에서도).

다음은 간단한 예입니다

'xyz'.localeCompare('XyZ', undefined, { sensitivity: 'base' }); // returns 0

그리고 당신이 사용할 수있는 일반적인 기능

function equalsIgnoringCase(text, other) {
    return text.localeCompare(other, undefined, { sensitivity: 'base' }) === 0;
}

대신 undefined작업중인 특정 로캘을 입력해야합니다. MDN 문서에 표시된대로 중요합니다.

스웨덴어로 ä와 a는 별도의 기본 문자입니다.

감도 옵션

MDN에서 표식 된 감도 옵션

브라우저 지원

게시 시점 현재 Android 용 UC 브라우저 및 Opera Mini 로캘옵션 매개 변수를 지원 하지 않습니다 . 최신 정보는 https://caniuse.com/#search=locale 비교 를 확인 하십시오 .


답변

정규 표현의 도움으로 우리도 달성 할 수 있습니다.

(/keyword/i).test(source)

/i무시하는 경우입니다. 필요하지 않은 경우와 같이 대소 문자를 구분하지 않는 NOT을 무시하고 테스트 할 수 있습니다

(/keyword/).test(source)


답변

케이싱은 로캘 별 작업입니다. 시나리오에 따라 고려해야 할 수도 있습니다. 예를 들어, 두 사람의 이름을 비교하는 경우 로케일을 고려할 수 있지만 UUID와 같은 기계 생성 값을 비교하는 경우 그렇지 않을 수 있습니다. 이것이 내가 utils 라이브러리에서 다음 기능을 사용하는 이유입니다 (성능상의 이유로 유형 검사는 포함되지 않음).

function compareStrings (string1, string2, ignoreCase, useLocale) {
    if (ignoreCase) {
        if (useLocale) {
            string1 = string1.toLocaleLowerCase();
            string2 = string2.toLocaleLowerCase();
        }
        else {
            string1 = string1.toLowerCase();
            string2 = string2.toLowerCase();
        }
    }

    return string1 === string2;
}


답변

: 나는 최근에 대소 문자를 구분 문자열 도우미를 제공하는 마이크로 라이브러리 생성 한 https://github.com/nickuraltsev/ignore-case을 . toUpperCase내부적으로 사용합니다 .

var ignoreCase = require('ignore-case');

ignoreCase.equals('FOO', 'Foo'); // => true
ignoreCase.startsWith('foobar', 'FOO'); // => true
ignoreCase.endsWith('foobar', 'BaR'); // => true
ignoreCase.includes('AbCd', 'c'); // => true
ignoreCase.indexOf('AbCd', 'c'); // => 2


답변

불평등의 방향에 대해 우려하는 경우 (아마 목록을 정렬하려는 경우) 대소 문자 변환을 수행해야하며 유니 코드에는 대문자보다 소문자가 많으므로 toLowerCase는 아마도 가장 좋은 변환입니다.

function my_strcasecmp( a, b )
{
    if((a+'').toLowerCase() > (b+'').toLowerCase()) return 1
    if((a+'').toLowerCase() < (b+'').toLowerCase()) return -1
    return 0
}

Javascript는 문자열 비교에 로케일 “C”를 사용하는 것으로 보이므로 문자열에 ASCII 문자 이외의 문자가 포함되어 있으면 결과 순서가 추악합니다. 줄을 훨씬 더 자세히 검사하지 않고는 할 수있는 일이 많지 않습니다.