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
처리 á
).
참고 그 세 번째 매개 변수 localeCompare
IE10에서 지원 또는 낮추거나 당신이 그 브라우저를 지원해야하는 경우, 당신은 대체 어떤 종류의가 필요합니다 그래서 특정 모바일 브라우저 (위에 링크 된 페이지의 호환성 차트를 참조)되지 않습니다
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는 별도의 기본 문자입니다.
감도 옵션
브라우저 지원
게시 시점 현재 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 문자 이외의 문자가 포함되어 있으면 결과 순서가 추악합니다. 줄을 훨씬 더 자세히 검사하지 않고는 할 수있는 일이 많지 않습니다.