Як зробити порівняння рядків без врахування регістру?

Як виконати порівняння рядків без врахування регістру в JavaScript?

Рішення

Найпростіший спосіб зробити це (якщо вас не турбують спеціальні символи Unicode) - викликати toUpperCase:

var areEqual = string1.toUpperCase() === string2.toUpperCase();
Коментарі (8)

**РЕДАГУВАТИ]: Ця відповідь була додана 9 років тому. Сьогодні вам слід використовувати localeCompare з опцією чутливість: 'наголос':

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'));

Параметр { чутливість: 'наголос' } вказує 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 - використовувати метод RegExp match() з прапором i.

https://stackoverflow.com/questions/177719/javascript-case-insensitive-search

Якщо обидва порівнювані рядки є змінними (а не константами), то все трохи складніше, оскільки потрібно згенерувати RegExp з рядка, але передача рядка в конструктор RegExp може призвести до некоректних збігів або невдалих збігів, якщо в рядку присутні спеціальні regex-символи.

Якщо ви дбаєте про інтернаціоналізацію, не використовуйте toLowerCase() або toUpperCase(), оскільки вони не забезпечують точне порівняння без урахування регістру у всіх мовах.

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

Коментарі (9)

Я написав продовження. Дуже тривіальне.

if (typeof String.prototype.isEqual!= 'function') {
    String.prototype.isEqual = function (str){
        return this.toUpperCase()==str.toUpperCase();
     };
}
Коментарі (3)